pymssql游标执行参数化查询错误

问题描述 投票:0回答:1

当我使用以下查询尝试 pymssqlcursor.execute(query,parameter) 时,它有效:

SELECT * 
FROM Accounts,Ident  
WHERE
 Accounts.Pat_ID1 = Ident.Pat_ID1 AND
 Ident.IDA = %(patient_id)s

参数是一个字典{'patent_id'=23e344,'sqlTableName'='Accounts'}

但是,如果我将查询更改为使用相同的参数字典,则会收到错误消息 b“'Accounts' 附近的语法不正确。DB-Lib 错误消息 20018。问题是什么?谢谢。 约翰

SELECT * 
FROM %(sqlTableName)s,Ident  
WHERE
 %(sqlTableName)s.Pat_ID1 = Ident.Pat_ID1 AND
 Ident.IDA = %(patient_id)s
cursor execute pymssql parameterized
1个回答
0
投票

您正在尝试通过参数来识别表。 SQL Server 不允许您这样做。

DB-API Cursor.execute() 使用参数来构建参数化查询,而不是动态 SQL。动态 SQL 是生成然后作为单个命令执行的任意 SQL 命令。参数化查询是完全不同的事情,当您需要一种可重复的方式来查找相同类型的数据而不提前知道您要查找的具体内容(例如用户 ID 或状态或类似内容)时,请使用参数化查询.

您可以格式化字符串以从内部变量中识别表,如下所示...

table_name = 'Accounts'
query_string=f"SELECT * FROM {table_name}, People WHERE {table_name}.SomeCol = Ident.SomeCol AND People.patient_id = '%(patient_id)s';"
with pymssql.connect(*args) as conn:
    with conn.cursor() as cur:
        cur.execute(query_string, {patient_id: "ABC-DEF-123456"}
        rows = cur.fetchall()

但这在应用程序端是强烈不鼓励的——(有关详细信息,请参阅SQL注入)如果您出于某种原因确实需要动态SQL(例如,如果您需要循环多个表),请创建一个存储的生成动态 SQL 并从单独的表或类似内容读取参数的过程。

© www.soinside.com 2019 - 2024. All rights reserved.