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]
python
sql
model
sqlalchemy
Oerd
źródło
źródł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.
źródło
YourModel.query.get((pk1, pk2))
. Zwróć uwagę na krotkę.get()
zapytań funkcyjnych obiektów przez klucz podstawowy. Jeśli chcesz przesyłać zapytania wedługid
, najpierw ustawid
jako klucz podstawowy.Możesz zapytać użytkownika o id = 1 w ten sposób
session.query(User).get(1)
źródło
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',)
źródło
get()
wydaje się, że daje ci obiekt wyniku w pamięci (bez faktycznego odpytywania bazy danych), alefilter().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.
źródło
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)
źródło