Мне нужно запросить базу данных SQLAlchemy по ее id
чему-то похожему на
User.query.filter_by (username = 'peter')
но для id. Как мне это сделать? [Поиск в Google и SO не помог]
Мне нужно запросить базу данных SQLAlchemy по ее id
чему-то похожему на
User.query.filter_by (username = 'peter')
но для id. Как мне это сделать? [Поиск в Google и SO не помог]
В запросе есть функция get, которая поддерживает запрос по первичному ключу таблицы, который, как я предполагаю, равен id
.
Например, чтобы запросить объект с 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',)
get()
, кажется, дает вам объект результата в памяти (без фактического запроса базы данных), но filter().first()
всегда будет запрашивать базу данных. 19.11.2018 get
из-за повышения эффективности. 19.11.2018 get
более эффективен. 20.11.2018 get()
использовать кеш, а query().filter().first()
, похоже, нет. 29.08.2019 User.query.get(23,24,25,58,21)
? 18.05.2021 Если вы используете tables reflection
, у вас могут возникнуть проблемы с приведенными решениями. (Предыдущие решения здесь не работали для меня).
В итоге я использовал:
session.query(object._class_).get(id)
(object
был получен отражением из базы данных, поэтому вам нужно использовать .__class__
)
Надеюсь, это поможет.
User.query.get(23,24,25,58,21)
? 18.05.2021 Во-первых, вы должны установить 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)
YourModel.query.get((pk1, pk2))
. Обратите внимание на кортеж. 01.02.2018get()
запрашивает объекты по первичному ключу. Если вы хотите запросить поid
, вы должны сначала установитьid
в качестве первичного ключа. 07.10.2019session.get(User, 5)
? 07.05.2021User.query.get(23,24,25,58,21)
?? 18.05.2021