【问题标题】:Parse SQL parameter marker with pandas using dynamic tables使用动态表使用 pandas 解析 SQL 参数标记
【发布时间】:2019-09-05 14:16:57
【问题描述】:

我有以下代码:

query = """
    DECLARE @DATABASE VARCHAR(128) = '{}';
    DECLARE @SCHEMA VARCHAR(128) = '{}';
    DECLARE @TABLE VARCHAR(128) = '{}';
    DECLARE @sql VARCHAR(200) = 
    'SELECT * FROM ' + CONCAT(QUOTENAME(@DATABASE), '.', QUOTENAME(@SCHEMA), '.', QUOTENAME(@TABLE), ' WHERE COD = ?')
    EXEC sp_executesql @sql
    """.format(
    db_config.db.database, db_config.db.schema, db_config.db.table
)

return pd.read_sql_query(
    query, db_config.db.connection, params=[cod_sol]
)

在我添加 sql 参数标记 ' WHERE COD = ?' 之前,它一直正常工作。似乎 pandas 或 pyodbc 无法解析那种类型的查询,使用简单的 sql 语句就可以了,但不适用于动态表。

这是最终@sql 变量的结果:

SELECT * FROM [DB].[SCHEMA].[TABLE] WHERE COD = ?

所以看起来是对的。

有可能做那种事吗?

【问题讨论】:

    标签: python pandas pyodbc


    【解决方案1】:

    我已经解决了!

    我没有尝试一步一步直接执行sql语句,而是先构造sql查询,并生成其最终形式:

    SELECT * FROM [DB].[SCHEMA].[TABLE] WHERE COD = ?
    

    然后,我调用read_sql_query 传递参数

    query = """
        DECLARE @DATABASE VARCHAR(128) = '{}';
        DECLARE @SCHEMA VARCHAR(128) = '{}';
        DECLARE @TABLE VARCHAR(128) = '{}';
        DECLARE @sql NVARCHAR(200) = 
        'SELECT * FROM ' + CONCAT(QUOTENAME(@DATABASE), '.', QUOTENAME(@SCHEMA), '.', QUOTENAME(@TABLE)) WHERE COD = ?;
        SELECT @sql
        """.format(
        db_config.db.database, db_config.db.schema, db_config.db.table
    )
    con = db_config.db.connection
    query = con.execute(query).fetchval()
    
    # Now this is working
    pd.read_sql_query(query, con, params=[cod_xml]).reset_index(drop=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多