SqlAlchemy का उपयोग करके आईडी से क्वेरी कैसे करें?


95

मुझे SQLAlchemy डेटाबेस को इसके idसमान कुछ से क्वेरी करने की आवश्यकता है

User.query.filter_by (उपयोगकर्ता नाम = 'पीटर')

लेकिन आईडी के लिए। मैं यह कैसे करु? [Google और SO पर खोज करने से मदद नहीं मिली]


कृपया अधिक विवरण प्रदान करें, जैसे समकक्ष SQL या pseudocode क्या आप चाहते हैं। "SQLAlchemy डेटाबेस आईडी" क्या है?
डैनियल क्लेव

क्या आपके टेबल में एक आईडी कॉलम है?
कीथ

जवाबों:


130

क्वेरी में एक फ़ंक्शन है जो तालिका की प्राथमिक कुंजी द्वारा क्वेरी का समर्थन करता है, जो मुझे लगता है कि idहै।

उदाहरण के लिए, 23 की आईडी के साथ किसी ऑब्जेक्ट के लिए क्वेरी करने के लिए:

User.query.get(23)

नोट: जैसा कि कुछ अन्य टिप्पणीकारों और उत्तरों ने उल्लेख किया है, यह "प्राथमिक कुंजी पर एक क्वेरी फ़िल्टरिंग निष्पादित करें" के लिए बस आशुलिपि नहीं है। SQLAlchemy सत्र की स्थिति के आधार पर, यह कोड डेटाबेस को क्वेरी कर सकता है और एक नया उदाहरण लौटा सकता है, या यह वास्तव में डेटाबेस को क्वेरी किए बिना आपके कोड में पहले से उद्धृत ऑब्जेक्ट का एक उदाहरण लौटा सकता है। यदि आपने पहले से ऐसा नहीं किया है, तो असर को समझने के लिए SQLAlchemy सत्र पर प्रलेखन पढ़ने पर विचार करें ।


8
फ़ंक्शन प्राप्त करें कई प्राथमिक कुंजी का भी समर्थन करता है YourModel.query.get((pk1, pk2)):। टपल को नोटिस करें।
marc_aragones

3
get()समारोह प्रश्नों प्राथमिक कुंजी द्वारा वस्तुओं। यदि आप क्वेरी करना चाहते हैं id, तो आपको idपहले प्राथमिक कुंजी के रूप में सेट करना चाहिए ।

46

आप इस तरह से id = 1 के साथ एक यूजर को क्वेरी कर सकते हैं

session.query(User).get(1)


7

प्राप्त करें () आपकी अपेक्षा के अनुरूप नहीं है:

यदि आपका लेनदेन किया गया था:

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

यदि आप लेन-देन में हैं (प्राप्त करें) आपको डेटाबेस से क्वेरी किए बिना मेमोरी में परिणाम वस्तु देगा):

>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>

इसका उपयोग करने के लिए बेहतर है:

>>> 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
यह व्यवहार कैसे अप्रत्याशित है?
सोलोमन उको

मेरा मतलब है कि यदि आप लेन-देन में (सत्र.कॉम अभी तक नहीं) get()आपको स्मृति में परिणाम वस्तु देने के लिए प्रतीत होता है (वास्तव में डेटाबेस को क्वेरी किए बिना), लेकिन filter().first()हमेशा डेटाबेस को क्वेरी करेगा।
पांडा 912

क्या लेनदेन के दौरान डेटाबेस को समवर्ती रूप से बदलना संभव है? यदि नहीं, तो getदक्षता में वृद्धि के कारण उपयोग करना बेहतर है।
सुलैमान उको

1
जैसा कि मुझे पता है कि sqlalchemy async सामान के साथ काम नहीं कर सकता है (केवल gevent के साथ लगता है), और हाँ, getअधिक कुशल है।
पांडा 912 20'18

जहां तक ​​लेनदेन का सवाल है .first () किसी भी .get () से अलग क्यों है? क्या .first () हमेशा डेटाबेस में वापस जाता है? क्या यह है कि .get () वर्तमान env में दिखता है यह देखने के लिए कि क्या वह आईडी या कुछ जानता है?
मस्कट

1

यदि आप उपयोग करते tables reflectionहैं तो आपको दिए गए समाधानों के साथ समस्या हो सकती है। (यहाँ पिछले समाधान मेरे लिए काम नहीं किया)।

मैंने जो प्रयोग किया वह था:

session.query(object._class_).get(id)

( objectडेटाबेस से प्रतिबिंब द्वारा पुनर्प्राप्त किया गया था, यही कारण है कि आपको उपयोग करने की आवश्यकता है .__class__)

आशा है कि ये आपकी मदद करेगा।


0

सबसे पहले, आपको idप्राथमिक कुंजी के रूप में सेट करना चाहिए ।
तब आप query.get()ऑब्जेक्ट को क्वेरी करने के लिए विधि का उपयोग कर सकते हैं idजिसके द्वारा पहले से ही प्राथमिक कुंजी है।

query.get()प्राथमिक कुंजी द्वारा वस्तुओं को क्वेरी करने की विधि के बाद से ।
फ्लास्क- 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.