我在将SELECT的以下CASE语句转换为SQLAlchemy ORM时遇到问题。我一直收到错误:“不明确的文字:错误。使用'text()'函数表示SQL表达式文字,或'literal()'表示绑定值。”
Case语句检查变量,然后返回数据库中的列或选择文字。在运行sql语句之前设置文字。
DECLARE @str_cntry_cd varchar(3)
SELECT COUNTRY_CD,
CASE WHEN @str_cntry_cd IS NOT NULL THEN RESOLUTION_ID
ELSE 10
END AS RESOLUTION_ID
FROM COUNTRY
SQLAlchemy代码如下所示:
country_tbl = getattr(main_db.Base.classes, "COUNTRY")
c_res = case([(country_code != None, country_tbl.RESOLUTION_ID),],
else_ = literal(10)).label("resolution_id")
programs_sa = main_db.session.query(country_tbl.COUNTRY_CD.label("country_cd"),
c_res).all()
表格如下:
CREATE TABLE dbo.COUNTRY
(
COUNTRY_CD varchar(4) NOT NULL,
RESOLUTION_ID int NOT NULL
)
SQLAlchemy .9.9 Windows 7的 SQL Server 2008 R2 Python 2.7
答案 0 :(得分:2)
country_code != None
导致问题。
这将评估为python的True
/ False
,SQLAlchemy不知道如何转换为SQL的true / false,因为它不明确。因此,您需要使用SQLAlchemy的text
或literal
函数为您正在使用的SQL添加文字true / false。但更好的方法是使用true
或false
函数。
http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.true http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.false
所以你要用以下代码替换代码的错误部分:
db.false() if country is None else db.true()
希望这有帮助。