【问题标题】:SQLAlchemy : FOR XML PATH equivalentSQLAlchemy:FOR XML PATH 等价物
【发布时间】:2015-01-14 19:27:53
【问题描述】:

如何将包含多行的列放入 XML 标记中?

这是我的示例 mssql 代码 sn-p,

(SELECT DESCRIPTION 
 FROM WEV_STY PS WITH(NOLOCK) 
 JOIN MOEE_POV_STY MPS 
 WITH(NOLOCK) ON PS.STY_CD = MPS.PRV_STY_CD 
 FOR XML PATH('')) PPB_SDD

上述查询的 sqlalchemy 等效项是什么? 如何将 FOR XML PATH(' ') 翻译成 sqlalchemy?

【问题讨论】:

  • 您可以在此用例中使用 literal_column。它允许您将 任意 字符串作为列表达式 (literally)。示例:session.query(table.idn, literal_column("(select 1) as test").all。只要literal_column有效 SQL 列表达式,它就可以正常工作。请记住,它仅适用于特定数据库!

标签: sql sql-server sqlalchemy


【解决方案1】:

您可以在 SQLALCHEMY 中执行原始 SQL 查询。基于SQLALCHEMY docthis,尝试类似:

# pymssql
engine = create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname')
raw_con = engine.raw_connection()

try:
    cursor = raw_con.cursor()

    # add your proper SQL code here
    cursor.execute('(SELECT DESCRIPTION 
                     FROM WEV_STY PS WITH(NOLOCK) 
                     JOIN MOEE_POV_STY MPS 
                     WITH(NOLOCK) ON PS.STY_CD = MPS.PRV_STY_CD 
                     FOR XML PATH('')) PPB_SDD;')

    results = cursor.fetchall()
    cursor.close()
finally:
    raw_con.close()

【讨论】:

  • 与使用 SQLAlchemy 引擎执行原始 SQL 查询相比,有没有办法使用原始 SQLAlchemy 执行此查询?
【解决方案2】:

SQL SERVER

我已经实现了字符串连接而不使用“FOR XML PATH”,方法是编写一个 python 函数对 SQLAlchemy 查询获得的结果进行字符串连接,而不使用 'FOR XML PATH' 在小于 2017 的 sql server 版本上。

获取以下查询的结果:

SELECT DESCRIPTION, PS.STY_CD AS ID 
 FROM WEV_STY PS WITH(NOLOCK) 
 JOIN MOEE_POV_STY MPS 
 WITH(NOLOCK) ON PS.STY_CD = MPS.PRV_STY_CD

让我们说,

query_result = [{'DESCRIPTION': 'ABC', 'ID':1},  {'DESCRIPTION': 'DEF', 'ID': 2} {'DESCRIPTION': 'XYZ'. 'ID':1}]

result = string_concatination(query_result) # 基于相同的 'ID' 实现 string_concatination 功能

result = [{'DESCRIPTION': 'ABC, XYZ', 'ID': 1}, {'DESCRIPTION': 'DEF', 'ID': 2 }]

注意:由于我们从 db 表中获得的行数较少,因此我们将其用作当前解决方案。

SQL SERVER 版本 >= 2017

SQL 服务器内置了字符串连接功能“STRING_AGG() WITHIN GROUP()”,可以与 SQLAlchemy 的“func”方法一起使用。

【讨论】:

    猜你喜欢
    • 2018-07-29
    • 1970-01-01
    • 2015-07-14
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多