Dalam sebagian besar kasus, "pengetatan" dari pernyataan atau permintaan SQLAlchemy semudah:
print str(statement)
Ini berlaku baik untuk ORM Query
maupun 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 Query
objek 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 TypeDecorator
untuk tipe target yang mencakup
TypeDecorator.process_literal_param
metode:
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.engine
log SQLAlchemy . Ini mencatat kueri dan mengikat parameter, Anda hanya perlu mengganti placeholder mengikat dengan nilai-nilai pada string kueri SQL yang dibuat dengan mudah.