如何使用SqlAlchemy通过ID查询数据库?


95

我需要按其查询SQLAlchemy数据库 id类似于以下内容

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

但为身份证。我该怎么做呢?[通过Google和SO搜索没有帮助]


请提供更多详细信息,例如等效的SQL或伪代码。什么是“ SQLAlchemy数据库ID”?
Daniel Kluev 2011年

您的表格是否有一个ID列?
基思

Answers:


130

查询具有一个get函数,该函数支持通过表的主键进行查询,我认为id是这样。

例如,要查询ID为23的对象:

User.query.get(23)

注意:正如其他一些评论者和答案所述,这不仅仅是“对主键执行查询过滤”的简写。根据SQLAlchemy会话的状态,运行此代码可能会查询数据库并返回一个新实例,或者它可能会返回在代码中较早查询的对象的实例,而无需实际查询数据库。如果您尚未这样做,请考虑阅读SQLAlchemy会话上的文档以了解后果。


8
Get函数还支持多个主键:YourModel.query.get((pk1, pk2))注意元组。
marc_aragones

3
get()函数通过主键查询对象。如果要通过进行查询id,则应id首先将其设置为主键。


7

有时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',)

1
这种行为是如何意外的?
所罗门·乌科

我的意思是,如果您在事务中(尚未进行session.commit),get()似乎可以在内存中为您提供结果对象(实际上不查询数据库),但是filter().first()它将始终查询数据库。
panda912 '18

交易期间是否可以同时更改数据库?如果没有,get由于效率的提高,使用会更好。
所罗门·乌科

1
据我所知sqlalchemy无法使用异步的东西(似乎只与gevent),是的,这get是更有效的。
panda912 '18

为什么就交易而言,.first()与.get()有何不同?.first()是否总是返回数据库?是.get()首先在当前环境中查找以了解它是否知道该ID或其他信息?
msouth

1

如果您使用的tables reflection话,可能会遇到给定的解决方案问题。(这里的先前解决方案对我不起作用)。

我最终使用的是:

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

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

我希望这有帮助。


0

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

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

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.