В подавляющем большинстве случаев «строковое преобразование» оператора или запроса SQLAlchemy так же просто, как:
print str(statement)
Это относится как к ORM, Query
так и к любому select()
или другому утверждению.
Примечание : следующий подробный ответ сохраняется в документации по sqlalchemy .
Чтобы получить инструкцию как скомпилированную для определенного диалекта или движка, если сама инструкция еще не связана с какой-либо из них, вы можете передать это в compile () :
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 обычно не выполняет эту задачу, поскольку это обрабатывается соответствующим образом DBAPI Python, не говоря уже о том, что обход связанных параметров вероятно, наиболее широко используемые дыры в безопасности в современных веб-приложениях. 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})
у вышеупомянутого подхода есть предостережения, что он поддерживается только для базовых типов, таких как целые и строковые, и, кроме того, если 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.