Мені потрібно запитати базу даних 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)