Sqlalchemy 使用总结
程序员文章站
2024-03-02 21:59:28
...
1、常用语句总结
# 查询语句
print(session.query(User).get({'id': 1})) # 根据id获取一条数据 print(session.query(User).filter(User.id == 1).one()) # 查询符合条件的任何一条记录 print(session.query(User).filter(User.id == 1).first()) # 查询返回的第一条记录 print(session.query(User).filter_by(id=1).all()) # 查询返回符合条件的左右记录 print(session.query(User).filter(User.id == 1).first().user_name) # 如果未查询到数据,则会抛出异常 print(session.query(User).filter_by(user_name='test2').limit(2).all()) # 限制最多返回2条记录 print(session.query(User).filter_by(user_name='test2').offset(1).all()) # 从查询到的第二条记录开始返回 print(session.query(User).filter(or_(User.id == 1, User.id == 2)).all()) # or_多条件查询 print(session.query(User).filter(User.id.in_((1, 2))).all()) # in多条件查询 print(session.query(User).filter(not_(User.id == 1)).all()) # not_非条件过滤 print(session.query(func.count('*')).select_from(User).scalar()) # 使用查询传递函数统计 print(session.query(func.count(User.id)).scalar()) # 使用查询传递函数统计 print(session.query(User).filter(User.user_name.like('%xx%'))) # 模糊匹配查询 print(session.query(User).filter(User.id == 1).scalar().user_name) # 如果有记录,返回第一条记录的第一个元素 # 排序 all_users = session.query(User).order_by('user_name').all() # 根据user_name排序 all_users = session.query(User).order_by(User.user_password).all() # 根据user_password排序 all_users = session.query(User).order_by(User.user_password.desc()).all() # 根据user_password降序排序 all_users = session.query(User).order_by(User.user_name, User.user_password).all() # user_name升序,user_password降序排序 # 连接 print(session.query(User).join(Admin, User.id == Admin.id).filter().all()) # 内连接,如果没有外键的话,也可以手动指定关联外键 print(session.query(User).outerjoin(Admin).filter().all()) # 左外连接,此处Admin必须有字段为User的外键
2、高姿势操作
- 如何批量插入大批数据?
# 此种方式速度很快,ORM则方式则需要花费很长时间
session.execute(
User.__table__.insert(),
[{'name': `randint(1, 100)`,'age': randint(1, 100)} for i in xrange(10000)]
)
session.commit()
- 如何替换一个已有主键的记录?
# 此种方式比update更节省代码,实质也是先执行select再执行的update
user = User(id=1, name='ooxx')
session.merge(user)
session.commit()
- 如何使用无符号整数?
from sqlalchemy.dialects.mysql import INTEGER
id = Column(INTEGER(unsigned=True), primary_key=True)
- 为什么无法删除 in 操作查询出来的记录?
# 此条语句执行会报错
session.query(User).filter(User.id.in_((1, 2, 3))).delete()
抛出这样的异常
sqlalchemy.exc.InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.
这样执行是正确的
session.query(User).filter(or_(User.id == 1, User.id == 2, User.id == 3)).delete()
# 或者下面的方式
session.query(User).filter(User.id.in_((1, 2,3))).delete(synchronize_session=False)
session.commit() # or session.expire_all()
此外,update 操作也有同样的参数,如果后面立刻提交了,那么加上 synchronize_session=False 参数会更快。