Ich muss eine SQLAlchemy-Datenbank nach id
etwas Ähnlichem abfragen
User.query.filter_by (Benutzername = 'Peter')
aber für id. Wie mache ich das? [Die Suche über Google und SO hat nicht geholfen]
Ich muss eine SQLAlchemy-Datenbank nach id
etwas Ähnlichem abfragen
User.query.filter_by (Benutzername = 'Peter')
aber für id. Wie mache ich das? [Die Suche über Google und SO hat nicht geholfen]
Antworten:
Query hat eine get-Funktion , die das Abfragen nach dem Primärschlüssel der Tabelle unterstützt, was ich annehme id
.
So fragen Sie beispielsweise nach einem Objekt mit der ID 23:
User.query.get(23)
Hinweis: Wie einige andere Kommentatoren und Antworten erwähnt haben, ist dies nicht nur eine Abkürzung für "Durchführen einer Abfragefilterung für den Primärschlüssel". Abhängig vom Status der SQLAlchemy-Sitzung kann das Ausführen dieses Codes die Datenbank abfragen und eine neue Instanz zurückgeben, oder es kann eine Instanz eines Objekts zurückgeben, das zuvor in Ihrem Code abgefragt wurde, ohne die Datenbank tatsächlich abzufragen. Wenn Sie dies noch nicht getan haben, lesen Sie die Dokumentation zur SQLAlchemy-Sitzung , um die Auswirkungen zu verstehen.
YourModel.query.get((pk1, pk2))
. Beachten Sie das Tupel.
Sie können einen Benutzer mit der ID = 1 wie folgt abfragen
session.query(User).get(1)
get () entspricht manchmal nicht Ihren Erwartungen:
Wenn Ihre Transaktion abgeschlossen wurde:
>>> 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')>
Wenn Sie sich in einer Transaktion befinden (get () gibt Ihnen das Ergebnisobjekt im Speicher, ohne die Datenbank abzufragen):
>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>
besser zu verwenden:
>>> 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()
Ergebnisobjekt im Speicher zu erhalten scheinen (ohne die Datenbank tatsächlich abzufragen), aber das filter().first()
wird immer die Datenbank abfragen.
get
aufgrund der Effizienzsteigerung besser.
get
ist effizienter.
Wenn Sie verwenden, haben tables reflection
Sie möglicherweise Probleme mit den angegebenen Lösungen. (Die vorherigen Lösungen hier haben bei mir nicht funktioniert).
Was ich letztendlich benutzte, war:
session.query(object._class_).get(id)
( object
wurde durch Reflektion aus der Datenbank abgerufen, aus diesem Grund müssen Sie verwenden .__class__
)
Ich hoffe das hilft.
Zunächst sollten Sie id
als Primärschlüssel festlegen .
Dann können Sie die query.get()
Methode verwenden, um Objekte abzufragen, nach id
denen bereits der Primärschlüssel vorhanden ist.
Da die query.get()
Methode zum Abfragen von Objekten nach dem Primärschlüssel.
Abgeleitet aus der Flask-SQLAlchemy-Dokumentation
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)