SQLAlchemy与数据库交互

首先明确一个概念,SQLAlchemy通过Model.query方法对数据进行查询,Model.querydb.session.query(Model)的简写。即以下是等价的:

# User是Model
User.query.all()
db.session.query(User).all()

查询

简单查询

# 通过get()查询主键为9的user
db.session.query(User).get(9)
# 通过filter()指定字段查询年龄为22的user
db.session.query(User).filter(User.age == 22).first()
# 通过filter()指定字段查询年龄为22和account为test5的user
db.session.query(User).filter(User.age == 22, User.account == "test5").first()
# 通过filter_by()指定字段查询年龄为22的user
db.session.query(User).filter_by(age=22).all()
# 通过filter_by()指定字段查询年龄为22和account为test5的user
db.session.query(User).filter_by(age=22, account="test5").all()

其中,filter与filter的区别如下:

方法 语法 >、<查询 and_和or_查询
filter() 类名.属性名 用== 支持 支持
filter_by() 属性名 用= 不支持 不支持

查询结果处理

# 所有的结果都会加载到内存中。它返回的是一个列表,如果查询不到任何结果,返回的是空列表。
db.session.query(User).filter(User.age == 22).all()
# first() 返回查询到的第一个结果,如果没有查询到结果,返回None。
db.session.query(User).filter(User.age == 23).first()
# one() 如果只能查询到一个结果,返回它,否则抛出异常。没有结果抛出sqlalchemy.orm.exc.NoResultFound,
# 有超过一个结果时抛出sqlalchemy.orm.exc.MultipleResultsFound。
db.session.query(User).filter(User.age == 20).one()
# one_or_none()比起one()来,区别只是查询不到任何结果时不再抛出异常而是返回None。
db.session.query(User).filter(User.age == 23).one_or_none()
# scalar() 这个方法与.one_or_none()的效果一样。 如果查询到很多结果,抛出sqlalchemy.orm.exc.MultipleResultsFound异常。
# 如果只有一个结果,返回它,没有结果返回None。
db.session.query(User).filter(User.age == 23).scalar()
# 返回记录条数
db.session.query(User).filter(User.age >= 20).count()
# 限制返回条数
db.session.query(User).filter(User.age >= 20).limit(10).all()
# 过滤掉重复记录,
db.session.query(User).filter(User.age >= 20).distinct(User.password).all()

查询条件

# 与
db.session.query(User).filter(User.age >= 22, User.password == "123456").all()
# and与上面这种方式结果一样
 db.session.query(User).filter(and_(User.age >= 22, User.password == "123456")).all()
# 或
db.session.query(User).filter(or_(User.age >= 23, User.password == "123456")).all()
# or与and并存
db.session.query(User).filter(or_(User.age > 24, User.age < 20), User.password == "123456").all()
db.session.query(User).filter(or_(User.password == "123456", and_(User.age < 20, User.gender == "1"))).all()

    # in
    user6 = db.session.query(User).filter(User.age.in_([22, 19, 27])).all()
    print(user6)
    # not in
    user7 = db.session.query(User).filter(~User.age.in_([22, 19, 27])).all()
    print(user7)
    # like
    user8 = db.session.query(User).filter(User.name.like('小%')).all()
    print(str(user8) + "----------------------------------")
    # contains
    user9 = db.session.query(User).filter(User.name.contains('小')).all()
    print(user9)
    # 查询指定列
    user10 = db.session.query(User.name, User.password, User.age, User.gneder).all()
    print(user10)
    # 使用列表给filter方法传参
    conditions = list()
    conditions.append(User.name.like('%李%'))
    conditions.append(User.age < 28)
    user11 = db.session.query(User).filter(*conditions).all()
    print(user11)
    # 使用字典给filter_by方法传参
    condition_dict = dict()
    condition_dict['name'] = '小李'
    condition_dict['age'] = 27
    user12 = db.session.query(User).filter_by(**condition_dict).all()
    print(user12)
    return success(message="这是一条测试!")

你可能感兴趣的:(SQLAlchemy与数据库交互)