Wie kann ich mit SqlAlchemy eine Datenbank nach ID abfragen?


90

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]


Bitte geben Sie weitere Details an, z. B. gleichwertiges SQL oder Pseudocode, um das zu tun, was Sie möchten. Was ist "SQLAlchemy-Datenbank-ID"?
Daniel Kluev

Hat Ihre Tabelle eine ID-Spalte?
Keith

Antworten:


126

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.


8
Die Get-Funktion unterstützt auch mehrere Primärschlüssel : YourModel.query.get((pk1, pk2)). Beachten Sie das Tupel.
marc_aragones

3
Die get()Funktion fragt Objekte nach Primärschlüssel ab. Wenn Sie nach abfragen möchten id, sollten Sie idzuerst den Primärschlüssel festlegen .

45

Sie können einen Benutzer mit der ID = 1 wie folgt abfragen

session.query(User).get(1)


7

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',)

1
Wie ist dieses Verhalten unerwartet?
Solomon Ucko

Ich meine, wenn Sie in einer Transaktion (noch nicht session.commit) das get()Ergebnisobjekt im Speicher zu erhalten scheinen (ohne die Datenbank tatsächlich abzufragen), aber das filter().first()wird immer die Datenbank abfragen.
Panda912

Ist es möglich, die Datenbank während der Transaktion gleichzeitig zu ändern? Wenn nicht, ist die Verwendung getaufgrund der Effizienzsteigerung besser.
Solomon Ucko

1
Wie ich weiß, kann die SQLalchemie nicht mit dem asynchronen Zeug arbeiten (scheint nur mit gevent zu sein), und ja, das getist effizienter.
Panda912

Warum unterscheidet sich .first () in Bezug auf die Transaktion von .get ()? Geht .first () immer zur Datenbank zurück? Ist es so, dass .get () zuerst in der aktuellen Umgebung nachschaut, ob es diese ID kennt oder so?
msouth

1

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.


0

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.