【问题标题】:how to use a list as a parameter for SQL connection in python using pyodbcpython - 如何使用列表作为参数在python中使用pyodbc进行SQL连接
【发布时间】:2018-01-25 08:23:43
【问题描述】:

我正在学习 python,我正在尝试将参数作为 WHERE 子句的一部分传递。我正在使用熊猫和 pyodbc。这是我到目前为止所尝试的。我首先从 pandas 数据框中获取 c 列的数据,并将其转换为一个名为 df_col 的列表,其中包含大约 100 个数值

df_col=df['data_for_colc'].tolist()

然后,我执行 SQL 语句:

execu = mycursor.execute(
"""
Select 
 columnA
 ,columnb
 ,columnc
where
 columnc in (?)
""",df_col)

rows = mycursor.fetchall()
print(rows)

我能够从 SQL 服务器连接和下载数据,但我无法传递参数。我只需要能够根据我用 100 个值创建的列表下载这 100 行,但我收到一个错误:('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect ',' 附近的语法。(102) (SQLExecDirectW)")

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 您的 SELECT 语句没有 FROM 子句。

标签: python parameters pyodbc


【解决方案1】:

语法错误是因为您在查询中遗漏了FROM 子句。

修复该问题后,? 列表中的 ? 数量需要与 df_col 中的元素数量一样多。

placeholders = ", ".join(["?"] * len(df_col))
sql = """
    SELECT columnA, columnB, columnC
    FROM yourTable
    WHERE columnc IN (""" + placeholders + ")"
execu = mycursor.execute(sql, df_col)
rows = mycursor.fetchall()
print(rows)

【讨论】:

  • 是的,但参数占位符数量错误并不能解释语法错误。问题中所述查询的问题比这更根本。
  • 是的,那是因为他忘记了FROM tablename
  • @roganjosh 另一个答案使用.format(),所以我会留下字符串连接。但我已将连接移至另一个变量。
  • 谢谢。一开始它不起作用,但我发现它最后缺少一些“”。非常感谢。
  • @barmar 是的,我忘记了 SQL 语句中的 FROM。我的错。
【解决方案2】:

你必须生成所有这些问号......

execu = mycursor.execute(
"""
Select 
 columnA
 ,columnb
 ,columnc
where
 columnc in ({})
""".format(','.join("?"*len(df_col))), df_col)

rows = mycursor.fetchall()
print(rows)

【讨论】:

  • @Barmar 为什么我想要一个列表...我可以将','.join() 与字符串一起使用。它工作正常
  • 啊,对了,我忘了join 会遍历字符串的字符。 PHP/JS 太多...
猜你喜欢
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
相关资源
最近更新 更多