Sqlalchemy - 如何从带有绑定参数的insert(),update()语句中获取原始sql?

tk1*_*111 11 python orm sqlalchemy

例:

from sqlalchemy.dialects import mysql
from sqlalchemy import Integer, Column, update, insert
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Test(Base):
    __tablename__ = "test"

    a = Column(Integer, primary_key=True)
    b = Column(Integer)


update_stmt = update(Test).where(Test.a == 1).values(b=2)
print update_stmt.compile(dialect=mysql.dialect(), compile_kwargs=  {"literal_binds": True})

insert_stmt = insert(Test).values(a=1, b=1)
print insert_stmt.compile(dialect=mysql.dialect())
Run Code Online (Sandbox Code Playgroud)

结果是:

UPDATE test SET b=%s WHERE test.a = %s
INSERT INTO test (a, b) VALUES (%s, %s)
Run Code Online (Sandbox Code Playgroud)

问题是如何让sqlalchemy像这样生成smth:

UPDATE test SET b=2 WHERE test.a = 1
INSERT INTO test (a, b) VALUES (1, 1)
Run Code Online (Sandbox Code Playgroud)

因为select,compile_kwargs= {"literal_binds": True}解决了问题,但它不起作用update,insert.

谢谢你的帮助.

PS我需要从orm构建原始的sql查询,所以欢迎任何其他有简单生成原始sql的方法的建议.

kar*_*daj 2

我刚刚运行了这个片段python 2.7并且SQLAlchemy (1.0.13)它起作用了。

from sqlalchemy.dialects import mysql
from sqlalchemy import Integer, Column, update, insert
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Test(Base):
    __tablename__ = "test"

    a = Column(Integer, primary_key=True)
    b = Column(Integer)


update_stmt = update(Test).where(Test.a == 1).values(b=2)
print update_stmt.compile(dialect=mysql.dialect(), compile_kwargs={"literal_binds": True})

insert_stmt = insert(Test).values(a=1, b=1)
print insert_stmt.compile(dialect=mysql.dialect(), compile_kwargs={"literal_binds": True})
Run Code Online (Sandbox Code Playgroud)

我的输出是:

UPDATE test SET b=2 WHERE test.a = 1
INSERT INTO test (a, b) VALUES (1, 1)
Run Code Online (Sandbox Code Playgroud)

也许你的环境有问题?