【问题标题】:How to pass a list of parameter to Pandas read_sql with Teradata如何使用 Teradata 将参数列表传递给 Pandas read_sql
【发布时间】:2020-10-16 01:26:07
【问题描述】:

有没有办法或如何更正我的语法,以便将字符串参数列表传递给 Pandas 中的 SQL 查询?我有以下代码,但它不起作用 所以我有一个字符串列表,我需要将该列表参数动态传递到查询中

import teradatasql
import pandas as pd 

connection = tearadatasql.connect(host="xxx",user="xxx",password="xxx")
column_list = ['A','B','C']

query = """
            select column, row
            from table1
            where column in (%s)
        """

df = pd.read_sql(query, connection, params=column_list)      

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你应该在 %s 中填写一些参数

    df = psql.read_sql(('select "column","row" from "table1" '
                     'where "column" in %(col_list)s'), connection, params={'col_list':column_list})
    

    【讨论】:

    • 我尝试按照您的建议进行操作,但无法正常工作。我不知道如何或在哪里可以用正确的语法填充我的参数?
    • 我得到了新答案的新错误代码:': params unexpected type
    • 根据文档 params 可以是一个字典,你可以检查一下,也许你没有完全复制或错过了什么
    • 但我有一个列表,而不是我想传递给 SQL 的字典
    • 参数是列表但参数可以是字典
    【解决方案2】:

    你有几个问题:

    1. 在您的示例tearadatasql.connect 中,包名称teradatasql 拼写错误
    2. 您必须使用与要绑定的值的数量相同数量的问号参数标记组成 IN 谓词。

    在您的示例中,您打算绑定 column_list 变量中包含的三个值,因此您必须使用三个问号参数标记组成 IN 谓词。

    一般来说,您应该使用问号参数标记的数量等于您将绑定的参数值列表中值的数量来动态组合 IN 谓词。

    以下是修正这两个问题的示例的修改版本。我实际上运行了这个示例并验证了它是否有效。

    import teradatasql
    import pandas as pd 
    with teradatasql.connect(host="whomooz",user="guest",password="please") as connection:
      with connection.cursor() as cur:
        cur.execute("create volatile table table1 (c1 varchar(1), c2 integer) on commit preserve rows")
        cur.execute("insert into table1 values ('A', 1) ; insert into table1 values ('B', 2)")
      column_list = ['A','B','C']
      query = "select c1, c2 from table1 where c1 in ({}) order by c1".format(','.join(['?'] * len(column_list)))
      print(query)
      print("with params={}".format (column_list))
      df = pd.read_sql(query, connection, params=column_list)
      print(df)
    

    此示例产生以下输出:

    select c1, c2 from table1 where c1 in (?,?,?) order by c1
    with params=['A', 'B', 'C']
      c1  c2
    0  A   1
    1  B   2
    

    【讨论】:

    • 谢谢。它有效,我还找到了另一种使其也有效的方法。
    猜你喜欢
    • 2018-11-29
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多