Ich muss eine SQLAlchemy-Datenbank nach idetwas Ä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 idetwas Ä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.
getaufgrund der Effizienzsteigerung besser.
getist effizienter.
Wenn Sie verwenden, haben tables reflectionSie 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)
( objectwurde durch Reflektion aus der Datenbank abgerufen, aus diesem Grund müssen Sie verwenden .__class__)
Ich hoffe das hilft.
Zunächst sollten Sie idals Primärschlüssel festlegen .
Dann können Sie die query.get()Methode verwenden, um Objekte abzufragen, nach iddenen 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)