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)的实际长度。

考虑格式化字符串以按列表长度动态构建 ? 占位符,theargsotherargs。请注意,姓氏应位于参数列表的末尾,以对应于最后一个 ? 占位符。完成构建准备好的语句后,使用参数值传递给 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)