Saya perlu menanyakan database SQLAlchemy dengan id
sesuatu yang mirip dengan
User.query.filter_by (username = 'peter')
tapi untuk id. Bagaimana saya melakukan ini? [Menelusuri melalui Google dan SO tidak membantu]
python
sql
model
sqlalchemy
Oerd
sumber
sumber
Jawaban:
Kueri memiliki fungsi get yang mendukung kueri dengan kunci utama tabel, yang saya anggap demikian
id
.Misalnya, untuk meminta objek dengan ID 23:
User.query.get(23)
Catatan: Seperti yang disebutkan oleh beberapa pemberi komentar dan jawaban lain, ini bukan sekadar singkatan dari "Lakukan pemfilteran kueri pada kunci utama". Bergantung pada status sesi SQLAlchemy, menjalankan kode ini dapat meminta database dan mengembalikan instance baru, atau mungkin mengembalikan instance objek yang ditanyakan sebelumnya di kode Anda tanpa benar-benar meminta database. Jika Anda belum melakukannya, pertimbangkan untuk membaca dokumentasi di Sesi SQLAlchemy untuk memahami konsekuensinya.
sumber
YourModel.query.get((pk1, pk2))
. Perhatikan tupelnya.get()
query fungsi benda oleh kunci utama. Jika Anda ingin membuat kueri berdasarkanid
, Anda harus menetapkanid
sebagai kunci utama terlebih dahulu.Anda dapat menanyakan Pengguna dengan id = 1 seperti ini
session.query(User).get(1)
sumber
get () terkadang tidak seperti yang Anda harapkan:
jika transaksi Anda sudah selesai:
>>> 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')>
jika Anda berada dalam sebuah transaksi (get () akan memberi Anda objek hasil dalam memori tanpa query database):
>>> session.query(User).get(1) <User(u'ed', u'Ed Jones')>
lebih baik menggunakan ini:
>>> 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',)
sumber
get()
tampaknya memberi Anda objek hasil dalam memori (tanpa benar-benar query database), tetapifilter().first()
akan selalu query database.get
lebih baik karena peningkatan efisiensi.get
itu lebih efisien.Jika Anda menggunakan
tables reflection
Anda mungkin memiliki masalah dengan solusi yang diberikan. (Solusi sebelumnya di sini tidak berhasil untuk saya).Apa yang akhirnya saya gunakan adalah:
session.query(object._class_).get(id)
(
object
diambil dengan refleksi dari database, inilah mengapa Anda perlu menggunakan.__class__
)Saya harap ini membantu.
sumber
Pertama, Anda harus menetapkan
id
sebagai kunci utama.Kemudian Anda bisa menggunakan
query.get()
metode untuk meminta objekid
yang sudah menjadi kunci utama.Karena
query.get()
metode untuk query objek dengan kunci utama.Disimpulkan dari dokumentasi 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)
sumber