【发布时间】:2015-09-08 14:54:37
【问题描述】:
例子:
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())
这个结果是:
UPDATE test SET b=%s WHERE test.a = %s
INSERT INTO test (a, b) VALUES (%s, %s)
问题是如何让sqlalchemy像这样生成smth:
UPDATE test SET b=2 WHERE test.a = 1
INSERT INTO test (a, b) VALUES (1, 1)
对于select、compile_kwargs= {"literal_binds": True} 可以解决问题,但对于update、insert 不起作用。
感谢您的帮助。
附:我需要从 orm 构建原始 sql 查询,因此欢迎任何其他 orm 的建议,这些建议可以轻松生成原始 sql。
【问题讨论】:
-
试着把它放在引号里?
-
请参阅 SQLAlchemy 常见问题解答:How do I render SQL expressions as strings, possibly with bound parameters inlined?。你应该使用
literal_binds=True。 -
literal_binds可以用于select,但它不适用于insert、update。 -
@tk111 你找到解决方案了吗?
标签: python orm sqlalchemy