欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 参数会更快。

 

相关标签: Sqlalchemy