Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mendapatkan Pertanyaan SQL Sebenar yang Dilaksanakan dalam SQLAlchemy?

Bagaimana untuk Mendapatkan Pertanyaan SQL Sebenar yang Dilaksanakan dalam SQLAlchemy?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-18 13:15:031076semak imbas

How to Obtain the Actual SQL Query Executed in SQLAlchemy?

Mencetak Pertanyaan SQL Sebenar dalam SQLAlchemy

Melaksanakan pertanyaan SQL dalam SQLAlchemy melibatkan parameter mengikat untuk mengelakkan serangan suntikan SQL. Walau bagaimanapun, mendapatkan pertanyaan SQL sebenar, termasuk nilai, boleh mencabar.

Penyelesaian Umum

Kaedah paling mudah untuk mendapatkan kembali pertanyaan SQL sebagai rentetan adalah dengan menggunakan fungsi str():

<code class="python">print(str(statement))  # for both ORM Query and SQL statements</code>

Pelaksanaan Parameter Terikat

Secara lalai, SQLAlchemy mengikat parameter atas sebab keselamatan. Anda boleh menyekat tingkah laku ini menggunakan bendera literal_binds dalam compile_kwargs:

<code class="python">from sqlalchemy.dialects import postgresql

print(
    statement.compile(compile_kwargs={"literal_binds": True})
)</code>

Perhatikan bahawa pengikatan literal hanya disokong untuk jenis asas seperti integer dan rentetan.

Menyesuaikan Penukaran Parameter

Jika anda perlu menukar jenis yang lebih kompleks, anda boleh mencipta TypeDecorator tersuai dengan kaedah process_literal_param:

<code class="python">class MyFancyType(TypeDecorator):
    impl = Integer

    def process_literal_param(self, value, dialect):
        return "my_fancy_formatting(%s)" % value

print(
    tab.select().where(tab.c.x > 5).compile(
        compile_kwargs={"literal_binds": True})
)</code>

Ini akan menghasilkan pertanyaan seperti:

<code class="sql">SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)</code>

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Pertanyaan SQL Sebenar yang Dilaksanakan dalam SQLAlchemy?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn