Trong phần lớn các trường hợp, "chuỗi hóa" của câu lệnh hoặc truy vấn SQLAlchemy đơn giản như:
print str(statement)
Điều này áp dụng cả cho ORM Query
cũng như bất kỳ select()
hoặc bất kỳ tuyên bố nào khác.
Lưu ý : câu trả lời chi tiết sau đây đang được duy trì trên tài liệu sqlalchemy .
Để có được câu lệnh như được biên dịch cho một phương ngữ hoặc công cụ cụ thể, nếu bản thân câu lệnh chưa bị ràng buộc với một câu lệnh, bạn có thể chuyển câu lệnh này để biên dịch () :
print statement.compile(someengine)
hoặc không có động cơ:
from sqlalchemy.dialects import postgresql
print statement.compile(dialect=postgresql.dialect())
Khi được cung cấp một Query
đối tượng ORM , để có được compile()
phương thức này, trước tiên chúng ta chỉ cần truy cập vào trình truy cập .statement :
statement = query.statement
print statement.compile(someengine)
liên quan đến quy định ban đầu rằng các tham số bị ràng buộc phải được "nội tuyến" vào chuỗi cuối cùng, thách thức ở đây là SQLAlchemy thường không được giao nhiệm vụ này, vì điều này được Python DBAPI xử lý một cách thích hợp, chưa kể đến việc bỏ qua các tham số bị ràng buộc là có lẽ là lỗ hổng bảo mật được khai thác rộng rãi nhất trong các ứng dụng web hiện đại. SQLAlchemy có khả năng hạn chế để thực hiện chuỗi này trong một số trường hợp nhất định như phát ra DDL. Để truy cập chức năng này, người ta có thể sử dụng cờ 'lítal_binds', được chuyển đến 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})
Cách tiếp cận ở trên có một số lưu ý rằng nó chỉ được hỗ trợ cho các loại cơ bản, chẳng hạn như int và chuỗi, và hơn nữa nếu bindparam
không có giá trị đặt trước được sử dụng trực tiếp, thì nó cũng không thể xâu chuỗi được.
Để hỗ trợ kết xuất theo nghĩa đen nội tuyến cho các loại không được hỗ trợ, hãy triển khai loại TypeDecorator
cho mục tiêu bao gồm một
TypeDecorator.process_literal_param
phương thức:
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})
)
sản xuất như:
SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)
sqlalchemy.engine
nhật ký của SQLAlchemy . Nó ghi nhật ký các truy vấn và các tham số liên kết, bạn chỉ phải thay thế các trình giữ chỗ liên kết bằng các giá trị trên chuỗi truy vấn SQL được xây dựng sẵn.