首页 > 解决方案 > 查询执行 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. 最后,这里是我获取 Collection 名称值的地方:

CollectionName = f_CollectionName.get()

在此处输入图像描述 在此处 输入代码

标签: pythonvariablespymssql

解决方案


您的问题是由于列表/集合是无效参数。

您需要转换 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 字符串


推荐阅读