问题描述
我有一个带有基本 GUI 的 Python 脚本,可以登录到数据库并执行查询。
Python 脚本还要求提供 1 个名为“集合名称”的参数,该参数取自 tkinter .get 函数并作为 %s 添加到查询文本中。结果是每次我都可以使用不同的“集合名称”执行查询。这行得通,没问题
现在,我想将更大的集合名称字符串添加到我的 .get 函数中,以便我可以使用多个集合名称执行 cursor.execute 查询以获取更复杂的数据。但是我在将多个“集合名称”输入我的应用时遇到问题。
下面是我的 Query1 的一部分,它有 %s 变量,然后它从输入中获取到 tkinter。
From #Session1
Join vGSMRxLevRxQual On(#Session1.SessionId = vGSMRxLevRxQual.SessionId)
Where vGSMRxLevRxQual.RxLevSub<0 and vGSMRxLevRxQual.RxLevSub>-190
and #Session1.CollectionName in (%s)
Group by
#Session1.Operator
Order by #Session1.Operator ASC
IF OBJECT_ID('tempdb..#SelectedSession1') IS NOT NULL DROP TABLE #SelectedSession1
IF OBJECT_ID('tempdb..#Session1') IS NOT NULL DROP TABLE #Session1
-
这里是我尝试执行查询的地方
if Query == "GSMUERxLevelSub" : result = cursor.execute(GSMUERxLevelSub,(CollectionName,)) output = cursor.fetchmany df = DataFrame(cursor.fetchall()) filename = "2021_H1 WEEK CDF GRAPHS().xlsx" df1 = DataFrame.transpose(df,copy=False)
CollectionName = f_CollectionName.get()
enter image description here 在此处输入代码
解决方法
您的问题是由于列表/集合是无效参数。
您需要转换 collectionName
collection_name: list[str] = ['collection1','collection2']
new_collection_name = ','.join(f'"{c}"' for c in collection_name)
cursor.execute(sql,(new_collection_name,))
如果担心的话,不确定这种方法是否容易受到 SQL 注入的影响。
编辑:
忘记了 DBAPI 会在参数周围加上另一组引号。如果您可以执行以下操作:
CollectionName = ["foo","bar"]
sql = f"""
From #Session1
Join vGSMRxLevRxQual On(#Session1.SessionId = vGSMRxLevRxQual.SessionId)
Where vGSMRxLevRxQual.RxLevSub<0 and vGSMRxLevRxQual.RxLevSub>-190
and #Session1.CollectionName in ({",".join(["%s"] * len(CollectionName))})
"""
sql += """
Group by
#Session1.Operator
Order by #Session1.Operator ASC
"""
cursor.execute(sql,(CollectionName,))
编辑:更新到 F-string