将SELECT上的SQL Case转换为SQLAlchemy格式

时间:2016-02-17 12:12:33

标签: sqlalchemy

我在将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

1 个答案:

答案 0 :(得分:2)

country_code != None导致问题。 这将评估为python的True / False,SQLAlchemy不知道如何转换为SQL的true / false,因为它不明确。因此,您需要使用SQLAlchemy的textliteral函数为您正在使用的SQL添加文字true / false。但更好的方法是使用truefalse函数。

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()

希望这有帮助。