Мне нужно запросить базу данных SQLAlchemy своим id
чем-то похожим на
User.query.filter_by (имя пользователя = 'питер')
но для id. Как мне это сделать? [Поиск по Google и SO не помог]
Мне нужно запросить базу данных SQLAlchemy своим id
чем-то похожим на
User.query.filter_by (имя пользователя = 'питер')
но для id. Как мне это сделать? [Поиск по Google и SO не помог]
В Query есть функция get, которая поддерживает запросы по первичному ключу таблицы, что, как я полагаю, id
.
Например, чтобы запросить объект с идентификатором 23:
User.query.get(23)
Примечание. Как уже упоминалось в нескольких других комментариях и ответах, это не просто сокращение для "Выполнить фильтрацию запросов по первичному ключу". В зависимости от состояния сеанса SQLAlchemy, выполнение этого кода может запрашивать базу данных и возвращать новый экземпляр, или он может возвращать экземпляр объекта, запрошенного ранее в вашем коде, без фактического запроса к базе данных. Если вы еще этого не сделали, попробуйте прочитать документацию по сеансу SQLAlchemy, чтобы понять возможные последствия.
Вы можете запросить пользователя с id = 1, как этот
session.query(User).get(1)
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',)
Во-первых, вы должны установить 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)
Если вы используете tables reflection
, у вас могут возникнуть проблемы с данными решениями.
(Предыдущие решения здесь не помогли мне).
В итоге я использовал:
session.query(object._class_).get(id)
(object
был получен путем отражения из базы данных, поэтому вам нужно использовать .__class__
)
Надеюсь, это поможет.