Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Teradata将参数列表传递给Pandas read_sql_Python_Pandas - Fatal编程技术网

Python 如何使用Teradata将参数列表传递给Pandas read_sql

Python 如何使用Teradata将参数列表传递给Pandas read_sql,python,pandas,Python,Pandas,有没有一种方法或如何更正语法,以便将字符串的参数列表传递到pandas中的SQL查询中?我有以下代码,但它不工作 因此,我有一个字符串列表,需要将该列表参数动态地传递到查询中 import teradatasql import pandas as pd connection = tearadatasql.connect(host="xxx",user="xxx",password="xxx") column_list = ['A',

有没有一种方法或如何更正语法,以便将字符串的参数列表传递到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)      

您应该在%s中填入一些参数

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

您应该在%s中填入一些参数

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

您有几个问题:

  • 在您的示例中,
    teadatasql.connect
  • 必须使用与要绑定的值数量相同的问号参数标记来组合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
    

    您有几个问题:

  • 在您的示例中,
    teadatasql.connect
  • 必须使用与要绑定的值数量相同的问号参数标记来组合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
    

    我试着按照你的建议去做,但没有用。我不知道如何或在何处用正确的语法填充参数?我得到了新答案的新错误代码:':params意外类型根据文档params可以是dict,你能检查一下吗?也许你没有完全复制或遗漏了一些内容,但我有一个列表,我不想将dict传递到sqlserver。参数是一个列表,但参数可以是一个字典。我尝试按照您的建议执行,但它不起作用。我不知道如何或在何处用正确的语法填充参数?我得到了新答案的新错误代码:':params意外类型根据文档params可以是dict,你能检查一下吗?也许你没有完全复制或遗漏了一些内容,但我有一个列表,不是我想传递到sqlserver中的dict参数是一个列表,但参数可以是一个dictionaryThank。我也找到了另一种方法让它也能工作。谢谢。它是有效的,我也找到了另一种方法使它也有效。