Python - 将列表作为参数传递给 SQL,加上更多变量
Python - pass a list as params to SQL, plus more variables
我试图将未知数量的参数传递给 SQL 服务器 python 3.6。这是我使用 pypyodbc 的代码:
cursor = cnxn.cursor()
theargs= ['1033286869','1053474957','1063654630','1104116235','1104910306','JASON']
thesql = """SELECT *
FROM BI_DUPLICATES_STAGE_0
WHERE DUP_ID IN (?, ?, ?, ?, ?)
AND FRST_NM = ?
"""
cursor.execute(thesql, theargs)
resultset = cursor.fetchall()
这行得通。但是,我永远不确定我会拥有多少 DUP_IDs。我看过一些使用列表的示例,但是如果我有另一个变量,例如这种情况,FRST_NM
,那么我不能只使用列表。
因此,如果有人可以提供一个简单的示例,其中包含一个列表(不同长度)和另一个变量,以及如何将 SQL 变为 运行,我将不胜感激!如果这是问题所在,我不一定要使用 pypyodbc,还有另一种方法可以做到这一点。
更新:
感谢您提供格式正确的答案。只是一个快速的后续问题。我还是有点不清楚如果我必须生成如下内容,我将如何格式化 2 个列表:
SELECT * FROM BI_DUPLICATES_STAGE_0
WHERE DUP_ID IN (1033286869, 1053474957, 1063654630, 1104116235, 1104910306)
AND MID_NM IN ('SMITH','JON')
AND FRST_NM = 'JASON'
没有漂亮的格式连接,我有一些像这样的混乱:
SELECT * FROM BI_DUPLICATES_STAGE_0
WHERE DUP_ID IN (?,?,?,?,?)
AND MID_NM IN (?,?)
AND FRST_NM = ?
我如何按照建议将列表格式化两次?请记住,我不知道每个列表(ID 和 MID_NM)的实际长度。
考虑格式化字符串以按列表长度动态构建 ?
占位符,theargs 和 otherargs。请注意,姓氏应位于参数列表的末尾,以对应于最后一个 ?
占位符。完成构建准备好的语句后,使用参数值传递给 cursor.execute()
:
theargs= ['1033286869','1053474957','1063654630','1104116235','1104910306']
otherargs = ['SMITH','JON']
lastarg = ['JASON']
allargs = theargs + otherargs + lastarg
thesql = """SELECT *
FROM BI_DUPLICATES_STAGE_0
WHERE DUP_ID IN ({})
AND MID_NM IN ({})
AND FRST_NM = ?
""".format(",".join(['?' for i in range(len(theargs))]),
",".join(['?' for i in range(len(otherargs))]))
print(thesql)
# SELECT *
# FROM BI_DUPLICATES_STAGE_0
# WHERE DUP_ID IN (?,?,?,?,?)
# AND MID_NM IN (?,?)
# AND FRST_NM = ?
cursor.execute(thesql, allargs)
我试图将未知数量的参数传递给 SQL 服务器 python 3.6。这是我使用 pypyodbc 的代码:
cursor = cnxn.cursor()
theargs= ['1033286869','1053474957','1063654630','1104116235','1104910306','JASON']
thesql = """SELECT *
FROM BI_DUPLICATES_STAGE_0
WHERE DUP_ID IN (?, ?, ?, ?, ?)
AND FRST_NM = ?
"""
cursor.execute(thesql, theargs)
resultset = cursor.fetchall()
这行得通。但是,我永远不确定我会拥有多少 DUP_IDs。我看过一些使用列表的示例,但是如果我有另一个变量,例如这种情况,FRST_NM
,那么我不能只使用列表。
因此,如果有人可以提供一个简单的示例,其中包含一个列表(不同长度)和另一个变量,以及如何将 SQL 变为 运行,我将不胜感激!如果这是问题所在,我不一定要使用 pypyodbc,还有另一种方法可以做到这一点。
更新:
感谢您提供格式正确的答案。只是一个快速的后续问题。我还是有点不清楚如果我必须生成如下内容,我将如何格式化 2 个列表:
SELECT * FROM BI_DUPLICATES_STAGE_0
WHERE DUP_ID IN (1033286869, 1053474957, 1063654630, 1104116235, 1104910306)
AND MID_NM IN ('SMITH','JON')
AND FRST_NM = 'JASON'
没有漂亮的格式连接,我有一些像这样的混乱:
SELECT * FROM BI_DUPLICATES_STAGE_0
WHERE DUP_ID IN (?,?,?,?,?)
AND MID_NM IN (?,?)
AND FRST_NM = ?
我如何按照建议将列表格式化两次?请记住,我不知道每个列表(ID 和 MID_NM)的实际长度。
考虑格式化字符串以按列表长度动态构建 ?
占位符,theargs 和 otherargs。请注意,姓氏应位于参数列表的末尾,以对应于最后一个 ?
占位符。完成构建准备好的语句后,使用参数值传递给 cursor.execute()
:
theargs= ['1033286869','1053474957','1063654630','1104116235','1104910306']
otherargs = ['SMITH','JON']
lastarg = ['JASON']
allargs = theargs + otherargs + lastarg
thesql = """SELECT *
FROM BI_DUPLICATES_STAGE_0
WHERE DUP_ID IN ({})
AND MID_NM IN ({})
AND FRST_NM = ?
""".format(",".join(['?' for i in range(len(theargs))]),
",".join(['?' for i in range(len(otherargs))]))
print(thesql)
# SELECT *
# FROM BI_DUPLICATES_STAGE_0
# WHERE DUP_ID IN (?,?,?,?,?)
# AND MID_NM IN (?,?)
# AND FRST_NM = ?
cursor.execute(thesql, allargs)