微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

查询执行 Python 3.8 (pymssql) 中的 %s 变量

如何解决查询执行 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?