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]
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]
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.
YourModel.query.get((pk1, pk2))
. Perhatikan tupelnya.
Anda dapat menanyakan Pengguna dengan id = 1 seperti ini
session.query(User).get(1)
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',)
get()
tampaknya memberi Anda objek hasil dalam memori (tanpa benar-benar query database), tetapi filter().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.
Pertama, Anda harus menetapkan id
sebagai kunci utama.
Kemudian Anda bisa menggunakan query.get()
metode untuk meminta objek id
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)