【问题标题】:How to query database by id using SqlAlchemy?如何使用 SqlAlchemy 按 id 查询数据库?
【发布时间】:2011-10-08 15:58:15
【问题描述】:

我需要通过它的id 查询一个 SQLAlchemy 数据库,类似于

User.query.filter_by(username='peter')

但对于 id。我该怎么做呢? [通过 Google 和 SO 搜索没有帮助]

【问题讨论】:

  • 请提供更多详细信息,例如等效的 SQL 或伪代码执行您想要的操作。什么是“SQLAlchemy 数据库 ID”?
  • 你的表有id列吗?

标签: python sql model sqlalchemy


【解决方案1】:

Query 有一个get function 支持按表的主键查询,我假设id 是。

例如查询 ID 为 23 的对象:

User.query.get(23)

注意:正如其他一些评论者和答案所提到的,这不仅仅是“对主键执行查询过滤”的简写。根据 SQLAlchemy 会话的状态,运行此代码可能会查询数据库并返回一个新实例,或者它可能会返回代码中之前查询的对象的实例,而无需实际查询数据库。如果您还没有这样做,请考虑阅读documentation on the SQLAlchemy Session 以了解后果。

【讨论】:

  • 获取函数还支持多个主键:YourModel.query.get((pk1, pk2))注意元组。
  • get() 函数通过主键查询对象。如果您想通过id查询,您应该先将id设置为主键。
  • 由于 Query.get() 自 1.4 起已弃用 - 是 session.get(User, 5) 的替代品吗?
  • 如果我想通过 id 返回多个用户,我应该使用什么?喜欢User.query.get(23,24,25,58,21)??
【解决方案2】:

如果您使用tables reflection,您可能对给出的解决方案有疑问。 (这里以前的解决方案对我不起作用)。

我最终使用的是:

session.query(object._class_).get(id)

object是通过数据库反射检索到的,这就是为什么你需要使用.__class__

我希望这会有所帮助。

【讨论】:

  • 如果我想通过 id 返回多个用户,我应该使用什么?喜欢User.query.get(23,24,25,58,21)
【解决方案3】:

首先,您应该将id 设置为主键。
然后你可以使用query.get()方法通过id查询对象,这已经是主键了。

由于query.get()方法通过主键查询对象。
推断自Flask-SQLAlchemy documentation

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy()
db.init_app(app)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)

def test():
    id = 1
    user = User.query.get(id)

【讨论】:

    【解决方案4】:

    get() 有时不符合您的预期:

    如果您的交易已完成:

    >>> session.query(User).get(1)
    [SQL]: BEGIN (implicit)
    [SQL]: SELECT user.id AS user_id, user.name AS user_name, user.fullname AS user_fullname
    FROM user
    WHERE user.id = ?
    [SQL]: (1,)
    <User(u'ed', u'Ed Jones')>
    

    如果你在一个事务中(get() 会给你内存中的结果对象而不查询数据库):

    >>> session.query(User).get(1)
    <User(u'ed', u'Ed Jones')>
    

    最好用这个:

    >>> session.query(User.name).filter(User.id == 1).first()
    [SQL]: SELECT user.name AS user_name
    FROM user
    WHERE user.id = ?
     LIMIT ? OFFSET ?
    [SQL]: (1, 1, 0)
    (u'Edwardo',)
    

    【讨论】:

    • 这种行为是如何出乎意料的?
    • 我的意思是如果你在一个事务中(还不是 session.commit)get() 似乎会给你内存中的结果对象(没有实际查询数据库),但filter().first() 将始终查询数据库。
    • 事务期间是否可以同时更改数据库?如果没有,使用get会更好,因为效率会提高。
    • 据我所知,sqlalchemy 不能使用异步的东西(似乎只有 gevent ),是的,get 更有效。
    • 就事务而言,为什么 .first() 与 .get() 有什么不同? .first() 是否总是返回数据库? .get() 是先在当前环境中查找,看看它是否知道那个 id 还是什么?
    【解决方案5】:

    您可以像这样查询 id = 1 的用户

    session.query(User).get(1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 2019-10-16
      相关资源
      最近更新 更多