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