У переважній більшості випадків "строфікація" оператора або запиту SQLAlchemy така ж проста, як:
print str(statement)
Це стосується як ORM, Query
так і будь-якого select()
чи іншого твердження.
Примітка . Наступна детальна відповідь зберігається в документації sqlalchemy .
Щоб отримати оператор як скомпільований на певному діалекті чи двигуні, якщо висловлювання вже не пов'язане з одним, ви можете передати це у компілювати () :
print statement.compile(someengine)
або без двигуна:
from sqlalchemy.dialects import postgresql
print statement.compile(dialect=postgresql.dialect())
Коли нам дають Query
об'єкт ORM , для того, щоб отримати compile()
метод, нам потрібен лише спочатку доступ до доступу .statement :
statement = query.statement
print statement.compile(someengine)
що стосується початкового положення про те, що зв'язані параметри мають бути "вкладені" в остаточний рядок, то проблема тут полягає в тому, що SQLAlchemy зазвичай не ставить перед собою завдання, оскільки це обробляється належним чином Python DBAPI, не кажучи вже про обхід пов'язаних параметрів. мабуть, найбільш широко використовувані дірки в безпеці в сучасних веб-додатках. SQLAlchemy має обмежену можливість робити цю стратифікацію за певних обставин, таких як випромінювання DDL. Для доступу до цієї функціональності можна використовувати прапор 'literal_binds', переданий на 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})
вищевказаний підхід містить застереження, що він підтримується лише для базових типів, таких як ints та рядки, і, крім того, якщо значення bindparam
без попередньо встановленого значення використовується безпосередньо, воно також не зможе впорядкувати це.
Для підтримки вбудованого буквального відображення для типів, які не підтримуються, реалізуйте TypeDecorator
цільовий тип, що включає
TypeDecorator.process_literal_param
метод:
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})
)
отримання випуску типу:
SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)
sqlalchemy.engine
журнал SQLAlchemy . Він реєструє запити та параметри прив'язки, вам потрібно буде лише замінити заповнювачі заповнення на значення зі зручно побудованої рядки запитів SQL.