SQL कीमिया सत्र वस्तुओं का अपना execute
तरीका है:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
आपके सभी एप्लिकेशन क्वेरी सत्र ऑब्जेक्ट के माध्यम से होने चाहिए, चाहे वे कच्चे SQL हों या नहीं। यह सुनिश्चित करता है कि प्रश्नों को एक लेनदेन द्वारा ठीक से प्रबंधित किया जाता है , जो एक ही इकाई में एक ही अनुरोध के रूप में एकाधिक प्रश्नों को प्रतिबद्ध या वापस करने की अनुमति देता है। इंजन या कनेक्शन का उपयोग करके लेनदेन के बाहर जाने से आपको सूक्ष्म रूप से अधिक जोखिम होता है, संभवतः उन बगों का पता लगाना कठिन होता है जो आपको दूषित डेटा के साथ छोड़ सकते हैं। प्रत्येक अनुरोध को केवल एक लेन-देन के साथ जोड़ा जाना चाहिए, और db.session
यह सुनिश्चित करना कि यह आपके आवेदन के लिए मामला है।
यह भी ध्यान रखें कि पैरामीटर प्रश्नों केexecute
लिए डिज़ाइन किया गया है । SQL इंजेक्शन के हमलों से खुद को बचाने के लिए क्वेरी के लिए किसी भी इनपुट के लिए, उदाहरण के लिए , जैसे मापदंडों का उपयोग करें । आप इन मापदंडों के लिए दूसरा तर्क के रूप में मान प्रदान कर सकते हैं , जहां प्रत्येक कुंजी पैरामीटर का नाम है जैसा कि क्वेरी में दिखाई देता है। आपके डेटाबेस के आधार पर पैरामीटर का सटीक सिंटैक्स स्वयं भिन्न हो सकता है, लेकिन सभी प्रमुख रिलेशनल डेटाबेस किसी न किसी रूप में उनका समर्थन करते हैं।:val
dict
मान लिया जाये कि यह एक है SELECT
क्वेरी, इस वापस आ जाएगी एक iterable की RowProxy
वस्तुओं।
आप विभिन्न तकनीकों के साथ अलग-अलग कॉलम एक्सेस कर सकते हैं:
for r in result:
print(r[0]) # Access by positional index
print(r['my_column']) # Access by column name as a string
r_dict = dict(r.items()) # convert to dict keyed by column names
व्यक्तिगत रूप से, मैं परिणामों को namedtuple
s में बदलना पसंद करता हूं :
from collections import namedtuple
Record = namedtuple('Record', result.keys())
records = [Record(*r) for r in result.fetchall()]
for r in records:
print(r.my_column)
print(r)
यदि आप फ्लास्क-SQLAlchemy एक्सटेंशन का उपयोग नहीं कर रहे हैं, तो आप अभी भी आसानी से एक सत्र का उपयोग कर सकते हैं:
import sqlalchemy
from sqlalchemy.orm import sessionmaker, scoped_session
engine = sqlalchemy.create_engine('my connection string')
Session = scoped_session(sessionmaker(bind=engine))
s = Session()
result = s.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})