Bir SQLAlchemy veritabanını aşağıdakine id
benzer bir şeyle sorgulamam gerekiyor
User.query.filter_by (username = 'peter')
ama id için. Bunu nasıl yaparım? [Google ve SO üzerinden arama yapmak yardımcı olmadı]
Bir SQLAlchemy veritabanını aşağıdakine id
benzer bir şeyle sorgulamam gerekiyor
User.query.filter_by (username = 'peter')
ama id için. Bunu nasıl yaparım? [Google ve SO üzerinden arama yapmak yardımcı olmadı]
Yanıtlar:
Sorgu, tablonun birincil anahtarıyla sorgulamayı destekleyen bir get işlevine sahiptir, ki öyle olduğunu varsayıyorum id
.
Örneğin, kimliği 23 olan bir nesneyi sorgulamak için:
User.query.get(23)
Not: Birkaç başka yorumcu ve yanıtın da belirttiği gibi, bu sadece "Birincil anahtarda bir sorgu filtrelemesi gerçekleştirin" için bir kısaltma değildir. SQLAlchemy oturumunun durumuna bağlı olarak, bu kodu çalıştırmak veritabanını sorgulayabilir ve yeni bir örnek döndürebilir veya veritabanını gerçekten sorgulamadan kodunuzda daha önce sorgulanan bir nesnenin örneğini döndürebilir. Henüz yapmadıysanız , sonuçlarını anlamak için SQLAlchemy Oturumundaki belgeleri okumayı düşünün .
YourModel.query.get((pk1, pk2))
. Demire dikkat edin.
İd = 1 olan bir Kullanıcıyı bunun gibi sorgulayabilirsiniz
session.query(User).get(1)
get () bazen beklediğiniz gibi olmayabilir:
işleminiz yapıldıysa:
>>> 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')>
bir işlem içindeyseniz (get (), veritabanını sorgulamadan size bellekteki sonuç nesnesini verecektir):
>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>
bunu kullanmak daha iyi:
>>> 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()
size bellekte sonuç nesnesini veriyor gibi görünüyor (veritabanını gerçekten sorgulamadan), ancak filter().first()
her zaman veritabanını sorgulayacaktır.
get
verimlilik artışı nedeniyle kullanmak daha iyidir.
get
daha verimli.
Eğer kullanırsanız tables reflection
, verilen çözümlerle ilgili sorunlarınız olabilir. (Buradaki önceki çözümler benim için işe yaramadı).
Kullanmaya son verdiğim şey şuydu:
session.query(object._class_).get(id)
( object
veritabanından yansıma yoluyla alındı, bu nedenle kullanmanız gerekir.__class__
)
Umarım bu yardımcı olur.
İlk id
olarak, birincil anahtar olarak ayarlamalısınız .
Daha sonra , zaten birincil anahtar olan query.get()
nesneleri sorgulamak için yöntemi kullanabilirsiniz id
.
Yana query.get()
sorguya yöntem, primer anahtar tarafından nesneleri.
Olayla Flask-SQLAlchemy belgelerinde
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)