Muszę wysłać zapytanie do bazy danych SQLAlchemy na podstawie id
czegoś podobnego do
User.query.filter_by (nazwa użytkownika = 'peter')
ale dla id. Jak mam to zrobic? [Wyszukiwanie w Google i SO nie pomogło]
Muszę wysłać zapytanie do bazy danych SQLAlchemy na podstawie id
czegoś podobnego do
User.query.filter_by (nazwa użytkownika = 'peter')
ale dla id. Jak mam to zrobic? [Wyszukiwanie w Google i SO nie pomogło]
Odpowiedzi:
Query ma funkcję get, która obsługuje zapytania przy użyciu klucza podstawowego tabeli, co, jak zakładam, id
jest.
Na przykład, aby zapytać o obiekt o identyfikatorze 23:
User.query.get(23)
Uwaga: jak wspomniało kilku innych komentatorów i odpowiedzi, nie jest to po prostu skrót od „Przeprowadź filtrowanie zapytań na kluczu podstawowym”. W zależności od stanu sesji SQLAlchemy, uruchomienie tego kodu może spowodować wysłanie zapytania do bazy danych i zwrócenie nowej instancji lub może zwrócić wystąpienie obiektu odpytanego wcześniej w kodzie bez faktycznego wysyłania zapytania do bazy danych. Jeśli jeszcze tego nie zrobiłeś, rozważ przeczytanie dokumentacji dotyczącej sesji SQLAlchemy, aby zrozumieć konsekwencje.
YourModel.query.get((pk1, pk2))
. Zwróć uwagę na krotkę.
Możesz zapytać użytkownika o id = 1 w ten sposób
session.query(User).get(1)
get () czasami nie jest zgodne z oczekiwaniami:
jeśli transakcja została wykonana:
>>> 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')>
jeśli jesteś w transakcji (get () da ci wynik w pamięci bez zapytania do bazy danych):
>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>
lepiej tego użyć:
>>> 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()
wydaje się, że daje ci obiekt wyniku w pamięci (bez faktycznego odpytywania bazy danych), ale filter().first()
zawsze będzie odpytywać bazę danych.
get
jest lepsze ze względu na wzrost wydajności.
get
jest bardziej wydajne.
Jeśli używasz, tables reflection
możesz mieć problemy z podanymi rozwiązaniami. (Poprzednie rozwiązania tutaj nie działały dla mnie).
Skończyło się na tym, że użyłem:
session.query(object._class_).get(id)
( object
został pobrany przez odbicie z bazy danych, dlatego musisz użyć .__class__
)
Mam nadzieję, że to pomoże.
Najpierw należy ustawić id
jako klucz podstawowy.
Następnie możesz użyć tej query.get()
metody do odpytywania obiektów, id
które są już kluczem podstawowym.
Ponieważ query.get()
metoda zapytań o obiekty za pomocą klucza podstawowego.
Wyprowadzono z dokumentacji 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)