python - 查询执行 Python 3.8 (pymssql) 中的 %s 变量
问题描述
我有一个带有基本 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)
最后,这里是我获取 Collection 名称值的地方:
CollectionName = f_CollectionName.get()
在此处输入图像描述 在此处 输入代码
解决方案
您的问题是由于列表/集合是无效参数。
您需要转换 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 字符串
推荐阅读
- java - 通过转换为具体(无界通配符)类型产生的意外未经检查的转换警告
- android - RecyclerView 不读取属性来分配值
- javascript - React Native TextInput onSubmitEditing 在每次按键时触发
- loops - ansible 2.4 如果已经安装了“with_item”循环和“when”条件,如何跳过安装 apt 包
- python - 如何让 Jedi-vim 导航到 Ctrl+click 上的声明?
- macos - 向 Tcl/Tk macOS 框架添加扩展
- java - ScrollView 在调整大小
- gtmetrix - 禁用的媒体标签对网站有什么危害?
- c++ - 通过在派生类中使其成为纯虚拟来“隐藏”基类虚函数是否有效?
- google-maps - 如何在 Xamarin Form googlemaps 中默认显示所有 pin 的信息窗口