अधिकांश मामलों में, SQLAlchemy स्टेटमेंट या क्वेरी का "स्ट्रिंगिफिकेशन" जितना सरल है:
print str(statement)
यह एक ORM के Query
साथ-साथ किसी भी select()
या अन्य कथन पर लागू होता है ।
नोट : निम्नलिखित विस्तृत जवाब sqlalchemy प्रलेखन पर बनाए रखा जा रहा है ।
किसी विशिष्ट बोली या इंजन को संकलित करने के लिए कथन प्राप्त करने के लिए, यदि कथन स्वयं पहले से ही बाध्य नहीं है, तो आप इसे संकलन करने के लिए पास कर सकते हैं () :
print statement.compile(someengine)
या बिना इंजन के:
from sqlalchemy.dialects import postgresql
print statement.compile(dialect=postgresql.dialect())
जब ORM Query
ऑब्जेक्ट दिया जाता है , तो उस compile()
विधि को प्राप्त करने के लिए हमें केवल .statement accessor की आवश्यकता होती है :
statement = query.statement
print statement.compile(someengine)
मूल शर्त के संबंध में कि बाउंड पैरामीटर को अंतिम स्ट्रिंग में "इनलाइन" किया जाना है, यहां चुनौती यह है कि SQLAlchemy को आमतौर पर इसके साथ काम नहीं किया जाता है, क्योंकि यह पायथन डीबीआरआई द्वारा उचित रूप से नियंत्रित किया जाता है, बाध्य मापदंडों का उल्लेख नहीं करना है। आधुनिक वेब अनुप्रयोगों में संभवतः सबसे व्यापक रूप से शोषित सुरक्षा छेद हैं। SQLAlchemy में डीडीएल को उत्सर्जित करने जैसी कुछ परिस्थितियों में इस स्ट्रिंग को करने की सीमित क्षमता है। इस कार्यक्षमता का उपयोग करने के लिए, कोई व्यक्ति 'शाब्दिक_बंड्स' फ़्लैग का उपयोग कर सकता है compile_kwargs
:
from sqlalchemy.sql import table, column, select
t = table('t', column('x'))
s = select([t]).where(t.c.x == 5)
print s.compile(compile_kwargs={"literal_binds": True})
उपर्युक्त दृष्टिकोण के बारे में कहा जाता है कि यह केवल बुनियादी प्रकारों के लिए समर्थित है, जैसे कि इन्ट्स और स्ट्रिंग्स, और इसके अलावा यदि bindparam
बिना पूर्व-निर्धारित मूल्य का सीधे उपयोग किया जाता है, तो वह इसे स्ट्रिंग करने में सक्षम नहीं होगा।
समर्थित नहीं प्रकारों के लिए इनलाइन शाब्दिक प्रतिपादन का समर्थन करने के TypeDecorator
लिए, लक्ष्य प्रकार के लिए लागू करें जिसमें एक TypeDecorator.process_literal_param
विधि शामिल है
:
from sqlalchemy import TypeDecorator, Integer
class MyFancyType(TypeDecorator):
impl = Integer
def process_literal_param(self, value, dialect):
return "my_fancy_formatting(%s)" % value
from sqlalchemy import Table, Column, MetaData
tab = Table('mytable', MetaData(), Column('x', MyFancyType()))
print(
tab.select().where(tab.c.x > 5).compile(
compile_kwargs={"literal_binds": True})
)
उत्पादन का उत्पादन की तरह:
SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)
sqlalchemy.engine
लॉग में टैप करके एक कम नाजुक समाधान का निर्माण कर सकते हैं । यह क्वेरीज़ और बाइंड पैरामीटर्स को लॉग करता है, आपको केवल बाइंड प्लेसहोल्डर्स को मूल्यों के साथ आसानी से निर्मित SQL क्वेरी स्ट्रिंग पर बदलना होगा।