Apabila menyahpepijat ungkapan SQLAlchemy, adalah penting untuk melihat pertanyaan SQL sebenar dilaksanakan, termasuk nilai khusus dan bukannya parameter pengikat . Walaupun SQLAlchemy tidak menyediakan kaedah eksplisit untuk ini, terdapat beberapa cara untuk mencapainya.
Dalam kebanyakan kes, anda hanya boleh memanggil str() pada pernyataan SQLAlchemy atau pertanyaan:
print(str(statement))
Ini berfungsi untuk kedua-dua pertanyaan ORM (objek pertanyaan) dan pernyataan SQL tulen (select(), dll.).
Jika anda memerlukan penyata yang disusun untuk enjin pangkalan data tertentu, anda boleh menggunakan kaedah compile():
print(statement.compile(some_engine))
Atau, jika anda tidak mempunyai enjin, anda boleh menentukan dialek:
from sqlalchemy.dialects import postgresql print(statement.compile(dialect=postgresql.dialect()))
Dalam keadaan tertentu, anda mungkin mahu menyelaraskan parameter terikat ke dalam rentetan SQL akhir. Ini boleh dicapai menggunakan bendera literal_binds:
print(statement.compile(compile_kwargs={"literal_binds": True}))
Perhatikan bahawa ini hanya disokong untuk jenis asas seperti integer dan rentetan. Untuk jenis yang lebih kompleks, anda mungkin perlu mencipta penghias jenis tersuai.
Untuk menyokong pemaparan sebaris jenis yang tidak disokong, anda boleh mencipta penghias jenis tersuai dengan kaedah process_literal_param:
class MyFancyType(TypeDecorator): ... def process_literal_param(self, value, dialect): return f"my_fancy_formatting({value})"
Dengan penghias ini, anda boleh menyelaraskan nilai kompleks:
print(tab.select().where(tab.c.x > 5).compile(compile_kwargs={"literal_binds": True}))
menghasilkan output seperti:
SELECT mytable.x FROM mytable WHERE mytable.x > my_fancy_formatting(5)
Atas ialah kandungan terperinci Bagaimana untuk Mencetak Pertanyaan SQL Sebenar dengan Nilai Semasa Penyahpepijatan dalam SQLAlchemy?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!