আমি কীভাবে কোনও এসকিউএএলএলচেমি এক্সপ্রেশন থেকে একটি কাঁচা, সংকলিত এসকিউএল কোয়েরি পেতে পারি?


107

আমার কাছে একটি এসকিউএএলএলকেমি ক্যোয়ারী অবজেক্ট রয়েছে এবং সংকলিত এসকিউএল স্টেটমেন্টের সমস্ত পরামিতি আবদ্ধ (যেমন, কোনও %sবিবরণ সংকলক বা মাইএসকিউএলডিবি ডায়ালেক্ট ইঞ্জিন ইত্যাদির দ্বারা আবদ্ধ হওয়ার অপেক্ষায় নেই বা অন্যান্য ভেরিয়েবলগুলি) পাঠ্য পেতে চাই ।

str()ক্যোয়ারিতে কল করা এরকম কিছু প্রকাশ করে:

SELECT id WHERE date_added <= %s AND date_added >= %s ORDER BY count DESC

আমি ক্যোয়ারী অনুসন্ধান করার চেষ্টা করেছি __প্রেমগুলি কিন্তু এটি একটি খালি ডিক্স। আমি ব্যবহার আমার নিজের কম্পাইলার লিখেছিলেন এর এই উদাহরণে sqlalchemy.ext.compiler.compilesপ্রসাধক কিন্তু বিবৃতি এখনও রয়েছে %sযেখানে আমি ডেটা চাই।

কোয়েরিটি তৈরি করতে আমার পরামিতিগুলি মিশ্রিত হয়ে গেলে আমি বেশ বুঝতে পারি না; কোয়েরি অবজেক্টটি পরীক্ষা করার সময় এগুলি সর্বদা একটি খালি অভিধান (যদিও কোয়েরিটি সূক্ষ্ম কার্যকর করে এবং ইঞ্জিনটি প্রিন্ট করে যখন আপনি ইকো লগইন চালু করেন)।

আমি এই বার্তাটি পেতে শুরু করি যে এসকিউএএলএলচি আমার কাছে অন্তর্নিহিত কোয়েরিটি জানতে চায় না, কারণ এটি এক্সপ্রেশন এপিআইয়ের ইন্টারফেসের সমস্ত ভিন্ন ডিবি-এপিআইয়ের সাধারণ প্রকৃতিটিকে ভেঙে দেয়। কোয়েরিটি কী ছিল তা আবিষ্কার করার আগেই এটি কার্যকর করা হয়েছিল কিনা তা আমার আপত্তি নেই; আমি শুধু জানতে চাই!

উত্তর:


110

এই ব্লগ একটি আপডেট উত্তর প্রদান করে।

ব্লগ পোস্ট থেকে উদ্ধৃতি দিয়ে, এটি আমার জন্য প্রস্তাবিত এবং কাজ করা হয়েছে।

>>> from sqlalchemy.dialects import postgresql
>>> print str(q.statement.compile(dialect=postgresql.dialect()))

যেখানে q এর সংজ্ঞা দেওয়া হয়েছে:

>>> q = DBSession.query(model.Name).distinct(model.Name.value) \
             .order_by(model.Name.value)

বা সেশনের কোন ধরণের.কোয়ারী ()।

উত্তরের জন্য নিকোলাস কাদউকে ধন্যবাদ! আমি আশা করি এটি অন্যদের যারা এখানে অনুসন্ধানে আসে তাদের সহায়তা করে।


4
অভিধান হিসাবে মানগুলি পাওয়ার সহজ উপায় কি আছে?
দামিয়ান

6
@ ড্যামিয়েন প্রদত্ত c = q.statement.compile(...), আপনি কেবল পেতে পারেনc.params
হান্নেল

4
পোস্টটি মাইএসকিএল-এর সাথে ট্যাগ করা হয়েছে, সুতরাং এই উত্তরের পোস্টগ্র্যাস্কিল বিবরণটি সত্যই প্রাসঙ্গিক নয়।
হ্যানেল

4
আমি যদি ওপিকে সঠিকভাবে বুঝতে পারি তবে সে চূড়ান্ত কোয়েরি চায়। একটি উপভাষা নির্দিষ্ট করে (এখানে পোস্টগ্রিজ) মুদ্রণ আমাকে আক্ষরিক মানের পরিবর্তে স্থানধারক দেয় । @ ম্যাট এর উত্তর কাজ করে। স্থানধারকদের সাথে এসকিউএল প্রাপ্তি as_scalar()-আমি এর সাথে সহজতর অর্জন করা যেতে পারে Query
প্যাট্রিক বি।

4
@ পেট্রিকবি। আমি রাজী. ম্যাট এর উত্তর "সঠিক" উত্তর বিবেচনা করা উচিত। আমি ঠিক করে এই হিসাবে একই ফলাফল পেতে str(q)
আন্ড্রে সি। অ্যান্ডারসন

99

ডকুমেন্টেশন ব্যবহার literal_bindsএকটি ক্যোয়ারী প্রিন্ট করতে qপরামিতি অন্তর্ভুক্ত রয়েছে:

print(q.statement.compile(compile_kwargs={"literal_binds": True}))

উপরোক্ত পদ্ধতির সতর্কতা রয়েছে যে এটি কেবলমাত্র মৌলিক ধরণের জন্য যেমন ইনটস এবং স্ট্রিংগুলির জন্য সমর্থিত এবং তদ্বিতীয়ত যদি একটি প্রাক-সেট মান ব্যান্ডপ্যারাম () সরাসরি ব্যবহার করা হয় তবে তা সেটিকে আরও শক্তিশালী করতে সক্ষম হবে না।

নথিও এই সতর্কতা জারি করে:

অবিশ্বস্ত ইনপুট, যেমন ওয়েব ফর্ম বা অন্যান্য ব্যবহারকারী-ইনপুট অ্যাপ্লিকেশন থেকে প্রাপ্ত স্ট্রিং সামগ্রী সহ এই কৌশলটি কখনই ব্যবহার করবেন না। পাইথন মানগুলিকে সরাসরি এসকিউএল স্ট্রিংয়ের মানগুলিতে বাধ্য করার জন্য এসকিউএলএলচেমির সুবিধাগুলি অবিশ্বস্ত ইনপুট থেকে সুরক্ষিত নয় এবং যে ধরণের ডেটা পাস হচ্ছে তা বৈধ করে না। প্রোগ্রামিয়ালি কোনও রিলেশনাল ডাটাবেসের বিরুদ্ধে নন-ডিডিএল এসকিউএল স্টেটমেন্টের অনুরোধ করার সময় সর্বদা আবদ্ধ প্যারামিটারগুলি ব্যবহার করুন।


ধন্যবাদ! এটি অত্যন্ত সহায়ক ছিল, আমাকে ব্যথাহীনভাবে প্যান্ডাস পঠন_এসকিউএল ফাংশনটি ব্যবহার করার অনুমতি দিয়েছে!
জাস্টিন পামার

24

এটি স্কেলচেমি> = 0.6 এর সাথে কাজ করবে

from sqlalchemy.sql import compiler

from psycopg2.extensions import adapt as sqlescape
# or use the appropiate escape function from your db driver

def compile_query(query):
    dialect = query.session.bind.dialect
    statement = query.statement
    comp = compiler.SQLCompiler(dialect, statement)
    comp.compile()
    enc = dialect.encoding
    params = {}
    for k,v in comp.params.iteritems():
        if isinstance(v, unicode):
            v = v.encode(enc)
        params[k] = sqlescape(v)
    return (comp.string.encode(enc) % params).decode(enc)

4
এর জন্য ধন্যবাদ! দুঃখের সাথে আমি মাইএসকিউএল ব্যবহার করছি তাই আমার উপভাষাটি "পজিশনাল" এবং অভিধানের পরিবর্তে প্যারামের তালিকা থাকা দরকার। বর্তমানে
এটির

দয়া করে adaptএই পদ্ধতিতে ব্যবহার করবেন না । একটি ন্যূনতম কলটিতে প্রতিবার এটি থেকে ফেরতের মূল্যের জন্য প্রস্তুত করুন () যুক্তি হিসাবে সংযোগটি সরবরাহ করুন, যাতে এটি সঠিক উদ্ধৃতি দিতে পারে।
অ্যালেক্স গয়নার

@ অ্যালেক্স: সাইকোপগ দিয়ে সঠিক উদ্ধৃতি দেওয়ার সঠিক উপায় কী হবে? (রিটার্ন মান সম্পর্কে প্রস্তুতি ()
কলটি

দুঃখিত আমি মনে করি আমার শব্দবন্ধটি খারাপ ছিল, যতক্ষণ আপনি প্রেরণা (সংযোগ) কল করবেন আপনার ঠিক আছে। এটি কারণ "ভাল" এপিআইগুলি যা লিবিপিকিউ উদ্ধৃত করার জন্য সরবরাহ করে তার সংযোগের প্রয়োজন হয় (এবং এটি ইউনিকোড স্ট্রিংয়ের জন্য এনকোডিংয়ের মতো জিনিস সরবরাহ করে)।
অ্যালেক্স গয়নার

4
ধন্যবাদ আমি কলিং চেষ্টা করেছি prepareফেরত মান কিন্তু এটা যে পদ্ধতি আছে এই নয় যে মনে হয় হয়: AttributeError: 'psycopg2._psycopg.AsIs' object has no attribute 'prepare'। আমি সাইকোপজি ২ ২.২.১ বিটিডব্লিউ
আলবার্তভ

18

মাইএসকিউএলডিবি ব্যাকএন্ডের জন্য আমি আলবার্তোভের দুর্দান্ত উত্তরটি (অনেক অনেক ধন্যবাদ!) কিছুটা পরিবর্তন করেছি। আমি নিশ্চিত যে এগুলি কিনা একত্রিত হতে পারে কিনা তা যাচাই করার comp.positionalজন্য Trueতবে এটি এই প্রশ্নের ক্ষেত্রের সামান্য beyond

def compile_query(query):
    from sqlalchemy.sql import compiler
    from MySQLdb.converters import conversions, escape

    dialect = query.session.bind.dialect
    statement = query.statement
    comp = compiler.SQLCompiler(dialect, statement)
    comp.compile()
    enc = dialect.encoding
    params = []
    for k in comp.positiontup:
        v = comp.params[k]
        if isinstance(v, unicode):
            v = v.encode(enc)
        params.append( escape(v, conversions) )
    return (comp.string.encode(enc) % tuple(params)).decode(enc)

অসাধারণ! আমার কেবল আবশ্যক প্যারামিটার তালিকাটি মাইএসকিউএলে প্রেরণ করা হয়েছিল এবং উপরেরটিকে সংশোধন করে কেবল return tuple(params)একটি কবজির মতো কাজ করার জন্য ! অত্যন্ত বেদনাদায়ক রাস্তায় নামার কয়েক ঘন্টা আপনি আমাকে বাঁচিয়েছেন।
horcle_buzz

17

কথাটি হচ্ছে, স্ক্লাচেমি কখনই আপনার প্রশ্নের সাথে ডেটা মেশে না। আপনার অন্তর্নিহিত ডাটাবেস ড্রাইভারের কাছে ক্যোয়ারী এবং ডেটা পৃথকভাবে পাস করা হয়েছে - আপনার ডাটাবেসে ডেটার সংবরণ ঘটে।

স্ক্লালচেমি কোয়েরিটি আপনি যেমন দেখেছেন তেমন পাস করে str(myquery)ডাটাবেসে এবং মানগুলি আলাদা টিউপলে যাবে।

আপনি কিছু পদ্ধতির ব্যবহার করতে পারেন যেখানে আপনি নিজেরাই ক্যোয়ারির সাথে ডেটাটি বিভক্ত করেছেন (নীচে প্রস্তাবিত আলবার্তোভ হিসাবে), তবে স্কেলচেমি চালিয়ে যাচ্ছেন একই জিনিস নয়।


কেন এটা একই জিনিস না? আমি বুঝতে পেরেছি যে ডিবি-এপিআই লেনদেন করছে, সম্ভবত পুনরায় অর্ডারের প্রশ্নগুলি, ইত্যাদি, তবে এটি কি এর চেয়ে আরও বেশি আমার ক্যোয়ারীটি পরিবর্তন করতে পারে?
cce

4
@cce: আপনি চূড়ান্ত ক্যোয়ারী সন্ধান করার চেষ্টা করছেন। SELECT id WHERE date_added <= %s AND date_added >= %s ORDER BY count DESC IS চূড়ান্ত জিজ্ঞাস্য। এগুলি %sস্ক্লাচেমি দ্বারা ডেটাবেজে প্রেরণ করা হয় - স্ক্লাচেমি কখনই আসল তথ্য% s- এর জায়গায় রাখে
nosklo

@cce: কিছু dbapi মডিউল এটি করে না - এটি প্রায়শই ডাটাবেস নিজেই করে
nosklo

4
আরও খনন - আহা আমি কি বলছে তা, ধন্যবাদ দেখুন sqlalchemy.dialects.mysql.mysqldb, do_executemany()MySQLdb কার্সারের আলাদাভাবে বিবৃতি & পরামিতি প্রেরণ করা হয়। ইয়ে ইন্ডিয়ারেশন!
cce

12

প্রথমে আমাকে এই বলে প্রবন্ধটি দিয়ে দিন যে আমি ধরে নিয়েছি যে আপনি এটি মূলত ডিবাগিংয়ের উদ্দেশ্যে করছেন - আমি এসকিউএলএলচেমি ফ্লুয়েন্ট এপিআই এর বাইরে বিবৃতিটি সংশোধন করার চেষ্টা করার পরামর্শ দেব না।

দুর্ভাগ্যক্রমে ক্যোয়ারী প্যারামিটারগুলি অন্তর্ভুক্ত করে সংকলিত বিবৃতিটি দেখানোর সহজ উপায় বলে মনে হচ্ছে না। এসকিউএলএলচেমি আসলে বিবৃতিতে পরামিতি রাখে না - এগুলি অভিধান হিসাবে ডাটাবেস ইঞ্জিনে চলে গেছে । এটি এসকিউএল ইনজেকশন এড়াতে বিশেষ অক্ষরগুলি থেকে বাঁচার মতো ডেটাবেস-নির্দিষ্ট গ্রন্থাগারটিকে হ্যান্ডেল করতে দেয়।

তবে আপনি যুক্তিসঙ্গতভাবে সহজেই দ্বি-পদক্ষেপের প্রক্রিয়াতে এটি করতে পারেন। বিবৃতি পেতে, আপনি ইতিমধ্যে প্রদর্শিত হিসাবে আপনি করতে পারেন, এবং শুধু ক্যোয়ারী মুদ্রণ:

>>> print(query)
SELECT field_1, field_2 FROM table WHERE id=%s;

প্যারামিটারের নামগুলি দেখতে, আপনি ক্যোয়ার.স্টেটমেন্টের সাথে এক ধাপ আরও কাছে পেতে পারেন। উপরে :id_1বনাম বনাম নোট করুন %s- এই খুব সাধারণ উদাহরণে আসলেই সমস্যা নয়, তবে আরও জটিল বিবৃতিতে কী হতে পারে।

>>> print(query.statement)
>>> print(query.statement.compile()) # seems to be equivalent, you can also
                                     # pass in a dialect if you want
SELECT field_1, field_2 FROM table WHERE id=:id_1;

তারপরে, আপনি paramsসংকলিত বিবৃতিটির সম্পত্তি পেয়ে প্যারামিটারগুলির আসল মানগুলি পেতে পারেন :

>>> print(query.statement.compile().params)
{u'id_1': 1} 

এটি অন্তত একটি মাইএসকিউএল ব্যাকএন্ডের জন্য কাজ করেছে; আমি আশা করব এটি পোস্টগ্র্রেএসকিউএল ব্যবহারের প্রয়োজন ছাড়াই যথেষ্ট সাধারণ psycopg2


পাইচার্ম ডিবাগারের মধ্যে থেকে নিম্নলিখিতগুলি আমার জন্য কাজ করেছে ... qry.compile ()। প্যারামস
বেন

মজার বিষয়, আমি এই উত্তরটি লেখার পর থেকে এসকিউএএলএলকেমি কিছুটা বদলে যেতে পারে।
হ্যানলে

10

সাইকোপজি ২ ব্যবহার করে পোস্টগ্র্যাস্কল ব্যাকএন্ডের জন্য, আপনি do_executeইভেন্টটি শুনতে পারেন , তারপরে প্যারামিটারগুলিকে Cursor.mogrify()ইনলাইন করার জন্য কার্সার, স্টেটমেন্ট এবং টাইপ কোর্সড প্যারামিটারগুলি ব্যবহার করতে পারেন । ক্যোয়ারির প্রকৃত বাস্তবায়ন রোধ করতে আপনি সত্য ফিরিয়ে দিতে পারেন।

import sqlalchemy

class QueryDebugger(object):
    def __init__(self, engine, query):
        with engine.connect() as connection:
            try:
                sqlalchemy.event.listen(engine, "do_execute", self.receive_do_execute)
                connection.execute(query)
            finally:
                sqlalchemy.event.remove(engine, "do_execute", self.receive_do_execute)

    def receive_do_execute(self, cursor, statement, parameters, context):
        self.statement = statement
        self.parameters = parameters
        self.query = cursor.mogrify(statement, parameters)
        # Don't actually execute
        return True

নমুনা ব্যবহার:

>>> engine = sqlalchemy.create_engine("postgresql://postgres@localhost/test")
>>> metadata = sqlalchemy.MetaData()
>>> users = sqlalchemy.Table('users', metadata, sqlalchemy.Column("_id", sqlalchemy.String, primary_key=True), sqlalchemy.Column("document", sqlalchemy.dialects.postgresql.JSONB))
>>> s = sqlalchemy.select([users.c.document.label("foobar")]).where(users.c.document.contains({"profile": {"iid": "something"}}))
>>> q = QueryDebugger(engine, s)
>>> q.query
'SELECT users.document AS foobar \nFROM users \nWHERE users.document @> \'{"profile": {"iid": "something"}}\''
>>> q.statement
'SELECT users.document AS foobar \nFROM users \nWHERE users.document @> %(document_1)s'
>>> q.parameters
{'document_1': '{"profile": {"iid": "something"}}'}

4

নিম্নলিখিত সমাধানটি এসকিউএএলএলচেমি এক্সপ্রেশন ভাষা ব্যবহার করে এবং এসকিউএএএলএলচেমি ১.১ এর সাথে কাজ করে works এই সমাধানটি কোয়েরির সাথে প্যারামিটারগুলি মিশ্রিত করে না (মূল লেখকের অনুরোধ অনুসারে), তবে এসকিউএলএলকেমি মডেলগুলি বিভিন্ন এসকিউএল ডায়ালিকের জন্য এসকিউএল কোয়েরি স্ট্রিং এবং প্যারামিটার অভিধান তৈরি করতে একটি উপায় সরবরাহ করে। উদাহরণ টিউটোরিয়াল উপর ভিত্তি করে http://docs.sqlalchemy.org/en/rel_1_0/core/tutorial.html

ক্লাস দেওয়া,

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class foo(Base):
    __tablename__ = 'foo'
    id = Column(Integer(), primary_key=True)
    name = Column(String(80), unique=True)
    value = Column(Integer())

আমরা সিলেক্ট ফাংশনটি ব্যবহার করে একটি কোয়েরি স্টেটমেন্ট তৈরি করতে পারি ।

from sqlalchemy.sql import select    
statement = select([foo.name, foo.value]).where(foo.value > 0)

এরপরে আমরা স্টেটমেন্টটি ক্যোয়ারী অবজেক্টে কম্পাইল করতে পারি।

query = statement.compile()

ডিফল্টরূপে, বিবৃতিটি এসকিউএলাইট এবং ওরাকলের মতো এসকিউএল ডাটাবেসের সাথে সামঞ্জস্যপূর্ণ একটি বেসিক 'নামকরণ' প্রয়োগ করে সংকলিত হয়। আপনার যদি পোস্টগ্রিএসকিউএল এর মতো একটি উপভাষা নির্দিষ্ট করার প্রয়োজন হয় তবে আপনি এটি করতে পারেন

from sqlalchemy.dialects import postgresql
query = statement.compile(dialect=postgresql.dialect())

অথবা আপনি যদি স্পষ্টরূপে উপভাষাকে এসকিউএলাইট হিসাবে নির্দিষ্ট করতে চান তবে আপনি প্যারামস্টাইলটি 'কিউমার্ক' থেকে 'নামকরণ' করতে পারেন।

from sqlalchemy.dialects import sqlite
query = statement.compile(dialect=sqlite.dialect(paramstyle="named"))

ক্যোয়ারী অবজেক্ট থেকে আমরা কোয়েরি স্ট্রিং এবং কোয়েরি প্যারামিটারগুলি বের করতে পারি

query_str = str(query)
query_params = query.params

এবং অবশেষে কোয়েরিটি কার্যকর করুন।

conn.execute( query_str, query_params )

এই উত্তরটি 2 বছর আগে অ্যান্ডিবারের পোস্টের চেয়ে কীভাবে ভাল / আলাদা?
পাইওটার ডব্রোগস্ট

অ্যান্ডিবারের জবাবটিতে ডিবিএসশন দিয়ে ক্যোয়ারী স্টেটমেন্ট উত্পন্ন করার উদাহরণ অন্তর্ভুক্ত রয়েছে যদিও এই উত্তরে ঘোষণামূলক এপিআই এবং নির্বাচন পদ্ধতি ব্যবহার করে একটি উদাহরণ অন্তর্ভুক্ত রয়েছে। একটি নির্দিষ্ট উপভাষার সাথে ক্যোয়ারী বিবৃতি সংকলন করার ক্ষেত্রে, উত্তরগুলি একই। আমি কাঁচা ক্যোয়ারী উত্পন্ন করতে এসকিউএলএলকেমি ব্যবহার করি এবং তারপরে টুইটারের অ্যাডবাপি দিয়ে এগুলি সম্পাদন করি। এই ব্যবহারের ক্ষেত্রে, কীভাবে একটি সেশন ছাড়াই কোয়েরিটি সংকলন করতে হবে এবং কোয়েরি স্ট্রিং এবং প্যারামিটারগুলি বের করার জন্য দরকারী।
এরিক

3

আপনি সংযোগ- ইভেন্ট পরিবার থেকে ইভেন্টগুলি ব্যবহার করতে পারেন : after_cursor_executeবা before_cursor_execute

@Zzeek দ্বারা স্কেলচেমি ইউজেজের রেসিপিগুলিতে আপনি এই উদাহরণটি খুঁজে পেতে পারেন:

Profiling

...
@event.listens_for(Engine, "before_cursor_execute")
def before_cursor_execute(conn, cursor, statement,
                        parameters, context, executemany):
    conn.info.setdefault('query_start_time', []).append(time.time())
    logger.debug("Start Query: %s" % statement % parameters)
...

এখানে আপনি আপনার বিবৃতি অ্যাক্সেস পেতে পারেন


3

সুতরাং, এই বিভিন্ন উত্তরগুলির সামান্য বিটগুলি একসাথে রেখে আমি যা প্রয়োজন তা নিয়ে হাজির হয়েছি: একটি সাধারণ কোড সেট ড্রপ এবং মাঝে মাঝে কিন্তু নির্ভরযোগ্যতার সাথে (যেমন সমস্ত ডেটা ধরণের পরিচালনা করে) সঠিক, সংকলিত এসকিউএল আমার কাছে প্রেরণ করে স্রেফ জিজ্ঞাসাটি নিজেই জিজ্ঞাসাবাদ করে ব্যাকএন্ড পোস্টগ্র্রেস করেছে:

from sqlalchemy.dialects import postgresql

query = [ .... some ORM query .... ]

compiled_query = query.statement.compile(
    dialect=postgresql.dialect(),
    compile_kwargs={"literal_binds": True}
)
mogrified_query = session.connection().connection.cursor().mogrify(
    str(compiled_query),
    compiled_query.params
)

print("compiled SQL = {s}".format(mogrified_query.decode())

0

আমি মনে করি স্টেটমেন্ট সম্ভবত কৌশলটি করতে পারে: http://docs.sqlalchemy.org/en/latest/orm/query.html?hightlight=query

>>> local_session.query(sqlalchemy_declarative.SomeTable.text).statement
<sqlalchemy.sql.annotation.AnnotatedSelect at 0x6c75a20; AnnotatedSelectobject>
>>> x=local_session.query(sqlalchemy_declarative.SomeTable.text).statement
>>> print(x)
SELECT sometable.text 
FROM sometable

বিবৃতি আপনাকে দেখায় না যে পরামিতিগুলি কী, যদি আপনার কাছে কিছু ধরণের ফিল্টার সেট আপ থাকে।
হ্যানেল

0

আমি এই ছোট্ট ফাংশনটি তৈরি করেছি যা আমি যখন পুরো কোয়েরিটি মুদ্রণ করতে চাই তখন আমদানি করে থাকি, যখন ডায়ালেক্টটি ইতিমধ্যে আবদ্ধ থাকে তখন আমি পরীক্ষার মাঝে থাকি:

import re

def print_query(query):
    regex = re.compile(":(?P<name>\w+)")
    params = query.statement.compile().params
    sql = regex.sub("'{\g<name>}'", str(query.statement)).format(**params)
    print(f"\nPrinting SQLAlchemy query:\n\n")
    print(sql)
    return sql
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.