查询执行 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
  1. 这里是我尝试执行查询的地方

    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)
    
  2. 最后,这里是我获取集合名称值的地方:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...