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