首页 > 解决方案 > 问:如何在 Python 中将多个谓词传递给 SQL

问题描述

我正在使用 ibm_db_dbi 连接到 DB2 数据库,并且需要将多个谓词传递给 SQL。我有一些下面的示例代码可以工作,但在将多个谓词传递给 SQL 时遇到了困难。目标是将查询传递给 DB2,然后将数据写回 Python 中的列表或数据帧

这是我要传递给数据库的查询:

select someStuff
from tableA a join tableB b on a.key = b.key
where a.value = %s and a.date between %s and %s

我有一个数据框,其中包含三列(value 属性、date1 和 date 2)以及每列中的一堆值。我的计划是使用 for 循环传递数据并运行查询的次数与数据框中的行数一样多,然后将每个结果附加回列表对象。

我正在尝试通过一个适度、简单的示例查询来实现我的目标。到目前为止,我已经能够运行一个包含单个 parm 的查询,但很难将其扩展到三个。一个问题是我不知道如何在下面的查询对象引用中引用三个单独的“列”。任何帮助表示赞赏

以下是我迄今为止有效的测试查询:

blahList = [-123,123]
dataDB2 = []

for item in blahList:
  aTestSQL = """
  select '%s' value from sysibm.sysdummy1
  """
  query = aTestSQL % (item)
  curDB2 = conDB2.cursor()
  curDB2.execute(query)
  dataDB2.append(curDB2.fetchone())

标签: pythonsqlparameters

解决方案


这是我想出的一个解决方案,也许它会帮助下一个人:

blahlist = [(-1990963710,'ralph'), (3912019,'wreckit')]
dataDB2 = []

for idx, val in enumerate(blahlist):
  number = val[0]
  name = val[1]

  aTestSQL = """
  select %d NUMBER, '%s' NAME from sysibm.sysdummy1
  """
  query = aTestSQL % (number,name)
  curDB2 = conDB2.cursor()
  curDB2.execute(query)
  dataDB2.append(curDB2.fetchall())

推荐阅读