当前位置:Gxlcms > 数据库问题 > sqlalchemy(一)基本操作

sqlalchemy(一)基本操作

时间:2021-07-01 10:21:17 帮助过:9人阅读

连接数据库

在sqlalchemy中,session用于创建程序与数据库之间的会话。所有对象的载入和保存都需要通过session对象。

  1. <code class="language-python hljs"><span class="hljs-keyword">from sqlalchemy <span class="hljs-keyword">import create_engine
  2. <span class="hljs-keyword">from sqlalchemy.orm <span class="hljs-keyword">import sessionmaker
  3. engine = create_engine(<span class="hljs-string">‘mysql://user:passwd@ip:port/db‘, echo=<span class="hljs-keyword">True)
  4. Session = sessionmaker(bind=engine)
  5. session = Session()
  6. session.execute(<span class="hljs-string">‘show databases‘)
  7. </span></span></span></span></span></span></span></code>

其中,echoTrue代表打开logging。

创建一个映射

一个映射对应着一个Python类,用来表示一个表的结构。下面创建一个person表,包括id和name两个字段。

  1. <code class="language-python hljs"><span class="hljs-keyword">from sqlalchemy.ext.declarative <span class="hljs-keyword">import declarative_base
  2. Base = declarative_base()
  3. <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Person<span class="hljs-params">(Base):
  4. __tablename__ = <span class="hljs-string">‘person‘
  5. id = Column(Integer, primary_key=<span class="hljs-keyword">True)
  6. name = Column(String(<span class="hljs-number">32))
  7. <span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">__repr__<span class="hljs-params">(self):
  8. <span class="hljs-keyword">return <span class="hljs-string">"<Person(name=‘%s‘)>" % self.name
  9. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

添加数据

  1. <code class="language-python hljs"><span class="hljs-comment">#创建一个person对象
  2. person = Person(name=<span class="hljs-string">‘jack‘)
  3. <span class="hljs-comment">#添加person对象,但是仍然没有commit到数据库
  4. session.add(person)
  5. <span class="hljs-comment">#commit操作
  6. session.commit()
  7. </span></span></span></span></code>

如何获取id的?

  1. <code class="language-python hljs"><span class="hljs-meta">>>> person = Person(name=<span class="hljs-string">‘ilis‘)
  2. <span class="hljs-meta">>>> person.id <span class="hljs-comment">#此时还没有commit到mysql,因此无id
  3. <span class="hljs-meta">>>> session.add(person)
  4. <span class="hljs-meta">>>> person.id <span class="hljs-comment">#同上
  5. <span class="hljs-meta">>>> session.commit()
  6. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">08:<span class="hljs-number">23,<span class="hljs-number">530 INFO sqlalchemy.engine.base.Engine INSERT INTO person (name) VALUES (%s)
  7. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">08:<span class="hljs-number">23,<span class="hljs-number">531 INFO sqlalchemy.engine.base.Engine (<span class="hljs-string">‘ilis‘,)
  8. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">08:<span class="hljs-number">23,<span class="hljs-number">532 INFO sqlalchemy.engine.base.Engine COMMIT
  9. <span class="hljs-meta">>>> person.id <span class="hljs-comment">#commit后,可以获取该对象的id
  10. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">08:<span class="hljs-number">27,<span class="hljs-number">556 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
  11. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">08:<span class="hljs-number">27,<span class="hljs-number">557 INFO sqlalchemy.engine.base.Engine SELECT person.id AS person_id, person.name AS person_name
  12. FROM person
  13. WHERE person.id = %s
  14. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">08:<span class="hljs-number">27,<span class="hljs-number">557 INFO sqlalchemy.engine.base.Engine (<span class="hljs-number">5L,)
  15. <span class="hljs-number">5L
  16. >>>
  17. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

添加多个数据

  1. <code class="language-python hljs">session.add_all([
  2. Person(name=<span class="hljs-string">‘jack‘),
  3. Person(name=<span class="hljs-string">‘mike‘)
  4. ])
  5. session.commit()
  6. </span></span></code>

回滚

  1. <code class="language-python hljs"><span class="hljs-meta">>>> person = Person(name=<span class="hljs-string">‘test‘)
  2. <span class="hljs-meta">>>> session.add(person)
  3. <span class="hljs-meta">>>> session.query(person).filter(name==<span class="hljs-string">‘test‘)
  4. <span class="hljs-meta">>>> session.query(Person).filter(Person.name==<span class="hljs-string">‘test‘).all()
  5. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">13:<span class="hljs-number">23,<span class="hljs-number">265 INFO sqlalchemy.engine.base.Engine INSERT INTO person (name) VALUES (%s)
  6. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">13:<span class="hljs-number">23,<span class="hljs-number">265 INFO sqlalchemy.engine.base.Engine (<span class="hljs-string">‘test‘,)
  7. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">13:<span class="hljs-number">23,<span class="hljs-number">267 INFO sqlalchemy.engine.base.Engine SELECT person.id AS person_id, person.name AS person_name
  8. FROM person
  9. WHERE person.name = %s
  10. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">13:<span class="hljs-number">23,<span class="hljs-number">267 INFO sqlalchemy.engine.base.Engine (<span class="hljs-string">‘test‘,)
  11. [<demo.Person object at <span class="hljs-number">0x7f4e37730510>]
  12. <span class="hljs-meta">>>> session.rollback()
  13. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">13:<span class="hljs-number">37,<span class="hljs-number">496 INFO sqlalchemy.engine.base.Engine ROLLBACK
  14. <span class="hljs-meta">>>> session.query(Person).filter(Person.name==<span class="hljs-string">‘test‘).all()
  15. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">13:<span class="hljs-number">38,<span class="hljs-number">690 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
  16. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">13:<span class="hljs-number">38,<span class="hljs-number">691 INFO sqlalchemy.engine.base.Engine SELECT person.id AS person_id, person.name AS person_name
  17. FROM person
  18. WHERE person.name = %s
  19. <span class="hljs-number">2015<span class="hljs-number">-08<span class="hljs-number">-18 <span class="hljs-number">23:<span class="hljs-number">13:<span class="hljs-number">38,<span class="hljs-number">692 INFO sqlalchemy.engine.base.Engine (<span class="hljs-string">‘test‘,)
  20. []
  21. >>>
  22. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

数据查询

使用Session的query()方法。

  1. <code class="language-python hljs"><span class="hljs-comment">#获取所有数据
  2. session.query(Person).all()
  3. <span class="hljs-comment">#获取某一列数据,类似于django的get,如果返回数据为多个则报错
  4. session.query(Person).filter(Person.name==<span class="hljs-string">‘jack‘).one()
  5. <span class="hljs-comment">#获取返回数据的第一行
  6. session.query(Person).first()
  7. <span class="hljs-comment">#过滤数据
  8. session.query(Person.name).filter(Person.id><span class="hljs-number">1).all()
  9. <span class="hljs-comment">#limit
  10. session.query(Person).all()[<span class="hljs-number">1:<span class="hljs-number">3]
  11. <span class="hljs-comment">#order by
  12. session.query(Person).ordre_by(-Person.id)
  13. <span class="hljs-comment">#equal/like/in
  14. query = session.query(Person)
  15. query.filter(Person.id==<span class="hljs-number">1).all()
  16. query.filter(Person.id!=<span class="hljs-number">1).all()
  17. query.filter(Person.name.like(<span class="hljs-string">‘%ac%‘)).all()
  18. query.filter(Person.id.in_([<span class="hljs-number">1,<span class="hljs-number">2,<span class="hljs-number">3])).all()
  19. query.filter(~Person.id.in_([<span class="hljs-number">1,<span class="hljs-number">2,<span class="hljs-number">3])).all()
  20. query.filter(Person.name==<span class="hljs-keyword">None).all()
  21. <span class="hljs-comment">#and or
  22. <span class="hljs-keyword">from sqlalchemy <span class="hljs-keyword">import and_
  23. query.filter(and_(Person.id==<span class="hljs-number">1, Person.name==<span class="hljs-string">‘jack‘)).all()
  24. query.filter(Person.id==<span class="hljs-number">1, Person.name==<span class="hljs-string">‘jack‘).all()
  25. query.filter(Person.id==<span class="hljs-number">1).filter(Person.name==<span class="hljs-string">‘jack‘).all()
  26. <span class="hljs-keyword">from sqlalchemy <span class="hljs-keyword">import or_
  27. query.filter(or_(Person.id==<span class="hljs-number">1, Person.id==<span class="hljs-number">2)).all()
  28. </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

使用text

  1. <code class="language-python hljs"><span class="hljs-keyword">from sqlalchemy <span class="hljs-keyword">import text
  2. query.filter(text(<span class="hljs-string">"id>1")).all()
  3. query.filter(Person.id><span class="hljs-number">1).all() <span class="hljs-comment">#同上
  4. query.filter(text(<span class="hljs-string">"id>:id")).params(id=<span class="hljs-number">1).all() <span class="hljs-comment">#使用:,params来传参
  5. query.from_statement(
  6. text(<span class="hljs-string">"select * from person where name=:name")). params(name=<span class="hljs-string">‘jack‘).all()
  7. </span></span></span></span></span></span></span></span></span></span></code>

计数

Query使用count()函数来实现查询计数。

  1. <code class="language-python hljs">query.filter(Person.id><span class="hljs-number">1).count()
  2. </span></code>

group by的用法

  1. <code class="language-python hljs"><span class="hljs-keyword">from sqlalchemy <span class="hljs-keyword">import func
  2. session.query(func.count(Person.name), Person.name),group_by(Person.name).all()
  3. </span></span></code>

实现count(*)来查询表内行数

  1. <code class="language-python hljs">session.query(func.count(<span class="hljs-string">‘*‘)).select_from(Person).scalar()
  2. session.query(func.count(Person.id)).scalar()</span></code>

sqlalchemy(一)基本操作

标签:elf   查询   ssi   基本   create   first   values   %s   exe   

人气教程排行