python sqlalchemy(ORM)- 03 更新和查询

文章目录

  • ORM更新数据
  • ORM查询

ORM更新数据

  1. 查询到模型类对象,直接修改其属性值,即可更新;
  2. 查看更新的实例 session.dirty ;
  3. 查看新添加的实例对象–> session.new;
  4. 新添加的对象在session 中,user_obj in session ->True
  5. 只有提交事务(session.commit()),更新、添加才会同步到数据库中。
  6. 回滚事务,则所有的修改、添加 会恢复到之前的状态;

 

ORM查询

  1. 查询所有的字段,获取 Query 对象
from sqlalchemy.orm.query import Query
from sqlalchemy import text


# 查询User的所有字段,并按照id升序排序
query_obj = session.query(User).order_by(text("id asc"))

# 获取query对象中的数据
# 1. 遍历 获取每一个(记录)对象
# 2. query_obj.first()/.all()/.one()/.one_or_none() 获取对象

# 
  1. 查询局部字段,返回Query对象
# 查询name, fullname字段
query_obj = session.query(User.name, User.fullname)
# 对于query_obj 可遍历、可直接调用获取数据对象的方法
# 结果[('tom', '李四'), ('jack', '张三')]


# 查询User所有字段 + name字段
query_obj = session.query(User, User.name).all()
# 元组列表 [(tom, 'tom'), (jack, 'jack')]
# 元组第一个元素为User对象,第二个为name值

# 为字段指定别名  相当于select name as user_name from user_t;
query_obj = session.query(User.name.label("user_name")).all()

# 为模型类 指定别名
from sqlalchemy.orm import aliased
user_alias = aliased(User, name="user_alias")

# 根据别名查询
query_obj = session.query(user_alias).all()
  1. 排序、分页
  • 结果分片,实现分页;
  • offset().limit() 实现分页

# 查询User的所有字段的数据,按照id降序排序,并分页获取第一条
result = session.query(User).order_by(-User.id)[:1]  # 分片 分页
# 按照id升序排序,并分页获取第二条数据
result2 = session.query(User).order_by(User.id).offset(1).limit(1).all()
  1. 过滤查询
  • filter 复杂过滤;
  • filter_by 简单的等值过滤;
# 等值过滤
session.query(User.name).filter_by(fullname="Ed Jones")
# 复杂过滤
session.query(User.name).filter(User.fullname == "Ed Jones")
# 链式过滤
session.query(User).filter(User.name == "ed").filter(User.fullname == "Ed Jones")
  • 过滤操作符
    • _eq_() 等值匹配
    • _ne_() 不等
    • like 模糊匹配 (区分大小写)
    • ilike 不区分大小写
    • in_([]) 范围匹配
    • not_in([]) 不在该范围,相当于 ~ xx.in_
    • is_() 是xxx
    • is_not() 不是xxx
    • and_(条件1,条件2,…) 多个条件的与
    • or_(条件1,条件2,…) 多个条件的或
    • ~ 条件的取反
    • match() 开头匹配或者包含 sqlite数据库不支持
query.filter(User.name.in_(["ed", "wendy", "jack"]))

# works with query objects too:
query.filter(User.name.in_(session.query(User.name).filter(User.name.like("%ed%"))))

# use tuple_() for composite (multi-column) queries
from sqlalchemy import tuple_

query.filter(
    tuple_(User.name, User.nickname).in_([("ed", "edsnickname"), ("wendy", "windy")])
)


query.filter(User.name == None)

# alternatively, if pep8/linters are a concern
query.filter(User.name.is_(None))

# use and_()
from sqlalchemy import and_
query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))

# or send multiple expressions to .filter()
query.filter(User.name == 'ed', User.fullname == 'Ed Jones')

# or chain multiple filter()/filter_by() calls
query.filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')


from sqlalchemy import or_
query.filter(or_(User.name == 'ed', User.name == 'wendy'))
  1. 使用文本sql
from sqlalchemy import text
>>> for user in session.query(User).filter(text("id<224")).order_by(text("id")).all():
...     print(user.name)


session.query(User).filter(text("id<:value and name=:name")).params(
...     value=224, name="fred"
... ).order_by(User.id).one()

session.query(User).from_statement(text("SELECT * FROM users where name=:name")).params(
...     name="ed"
... ).all()

stmt = text("SELECT name, id, fullname, nickname " "FROM users where name=:name")
>>> stmt = stmt.columns(User.name, User.id, User.fullname, User.nickname)
>>> session.query(User).from_statement(stmt).params(name="ed").all()

stmt = text("SELECT name, id FROM users where name=:name")
>>> stmt = stmt.columns(User.name, User.id)
>>> session.query(User.id, User.name).from_statement(stmt).params(name="ed").all()

session.query(User).filter(User.name.like("%ed")).count()

Counting
Query includes a convenience method for counting called Query.count():
https://docs.sqlalchemy.org/en/14/orm/tutorial.html

你可能感兴趣的:(ORM,框架,python,数据库,ORM,sqlalchemy)