Dalam sebagian besar kasus, "pengetatan" dari pernyataan atau permintaan SQLAlchemy semudah:
print str(statement)
Ini berlaku baik untuk ORM Querymaupun select()pernyataan apa pun atau lainnya.
Catatan : jawaban terinci berikut dijaga pada dokumentasi sqlalchemy .
Untuk mendapatkan pernyataan yang dikompilasi ke dialek atau mesin tertentu, jika pernyataan itu sendiri belum terikat dengan yang Anda bisa melewati ini untuk mengkompilasi () :
print statement.compile(someengine)
atau tanpa mesin:
from sqlalchemy.dialects import postgresql
print statement.compile(dialect=postgresql.dialect())
Saat diberi Queryobjek ORM , untuk mendapatkan compile()metode ini, kita hanya perlu mengakses .statement accessor terlebih dahulu:
statement = query.statement
print statement.compile(someengine)
berkenaan dengan ketentuan asli bahwa parameter terikat harus "digariskan" ke dalam string terakhir, tantangan di sini adalah bahwa SQLAlchemy biasanya tidak ditugaskan dengan ini, karena ini ditangani dengan tepat oleh Python DBAPI, belum lagi melewati parameter terikat adalah mungkin lubang keamanan yang paling banyak dieksploitasi dalam aplikasi web modern. SQLAlchemy memiliki kemampuan terbatas untuk melakukan pengetatan ini dalam keadaan tertentu seperti memancarkan DDL. Untuk mengakses fungsi ini, seseorang dapat menggunakan bendera 'literal_binds', diteruskan ke 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})
pendekatan di atas memiliki peringatan bahwa itu hanya didukung untuk tipe dasar, seperti int dan string, dan lebih jauh lagi jika bindparam
tanpa nilai yang telah ditetapkan sebelumnya digunakan secara langsung, itu tidak akan dapat untuk mengikat itu juga.
Untuk mendukung rendering literal sebaris untuk tipe yang tidak didukung, terapkan a TypeDecoratoruntuk tipe target yang mencakup
TypeDecorator.process_literal_parammetode:
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})
)
menghasilkan output seperti:
SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)
sqlalchemy.enginelog SQLAlchemy . Ini mencatat kueri dan mengikat parameter, Anda hanya perlu mengganti placeholder mengikat dengan nilai-nilai pada string kueri SQL yang dibuat dengan mudah.