在 flask-sqlalchemy 3.0 中查询的正确方法是什么?

问题描述 投票:0回答:1

Stack Overflow 上的这个问题 提到得很好,

Query.get()
方法被认为是遗留的。从现在开始,我试图寻找正确的查询方式,我的问题是:我应该在我的 Flask 应用程序中使用这些方法中的哪一种?为什么?我应该继续使用 flask-sqlalchemy 框架,还是应该使用基本的 SQLalchemy?

所有这些行都是从

with app.app_context()
块运行的,它们都有相同的结果——它们返回一个用户对象:

  1. user = User.query.get(1)
    旧的做事方式(提到here
  2. user = db.session.get(User, 1)
    在OP中提到
  3. user = db.session.scalars(db.select(User).filter_by(id=1)).first()
    提到here
  4. user = db.session.execute(db.select(User).filter_by(id=1)).scalars().first()
    flask-sqlalchemy 文档中提到
  5. user = db.get_or_404(User, 1)
    也在那里提到。

据我了解,flask-sqlalchemy 推荐方法 (4)。与 (1) 或 (2) 相比,新的解决方案需要如此丑陋、令人困惑且不可读的语法,这对我来说很奇怪。

python sqlalchemy flask-sqlalchemy
1个回答
1
投票

所以经过更多的研究,我找到了以下答案:

  1. Flask-SQLAlchemy 3.x 将 SQLAlchemy 的版本升级到 1.4.x.
  2. 许多 SQLAlchemy 功能被“捆绑”到 Flask-SQLAlchemy 的
    SQLAlchemy
    对象中。更多关于这里。这意味着,我不必导入
    Column
    session
    select
    等关键字;他们可以使用
db = SQLAlchemy(app)
db.session
  1. 知道,关于 SELECT 语句的 SQLAlchemy 文档 终于有用了(我正在将文档链接到 2.0.7 版,因为在我看来,它在这里写得比 1.4.x 中写得更好。如果我要找到一些不一致的地方,我会在这里提到它)。
  2. select()
    现在是执行查询的方式
    .

在实践中,我认为这是现在执行查询的方式;我把它写在这里是为了(我自己的)将来更容易参考。我还使用了 Flask-SQLAlchemy 的语法,使用前面描述的

db.

  1. db.session.get(User, 1)
    使用主键进行选择,
    User.query.get(1)
    的继承者。返回
    User
    对象。
  2. db.session.scalars(db.select(User).where(User.email == "[email protected]")).first()
    使用其他列进行选择,继承
    User.query.filter_by(email="[email protected]").first()
    。返回“用户”对象。
  3. db.session.scalars(db.select(User)).all()
    获取所有用户,
    User.query.all()
    的继承者。返回
    list
    User
    个对象。
© www.soinside.com 2019 - 2024. All rights reserved.