Как запросить базу данных по идентификатору с помощью SqlAlchemy?

Мне нужно запросить базу данных SQLAlchemy своим id чем-то похожим на

User.query.filter_by (имя пользователя = 'питер')

но для id. Как мне это сделать? [Поиск по Google и SO не помог]

Ответ 1

В Query есть функция get, которая поддерживает запросы по первичному ключу таблицы, что, как я полагаю, id.

Например, чтобы запросить объект с идентификатором 23:

User.query.get(23)

Примечание. Как уже упоминалось в нескольких других комментариях и ответах, это не просто сокращение для "Выполнить фильтрацию запросов по первичному ключу". В зависимости от состояния сеанса SQLAlchemy, выполнение этого кода может запрашивать базу данных и возвращать новый экземпляр, или он может возвращать экземпляр объекта, запрошенного ранее в вашем коде, без фактического запроса к базе данных. Если вы еще этого не сделали, попробуйте прочитать документацию по сеансу SQLAlchemy, чтобы понять возможные последствия.

Ответ 2

Вы можете запросить пользователя с id = 1, как этот

session.query(User).get(1)

Ответ 3

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

Ответ 4

Во-первых, вы должны установить 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)

Ответ 5

Если вы используете tables reflection, у вас могут возникнуть проблемы с данными решениями. (Предыдущие решения здесь не помогли мне).

В итоге я использовал:

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

(object был получен путем отражения из базы данных, поэтому вам нужно использовать .__class__)

Надеюсь, это поможет.