sql-server - pyodbc 的参数化创建查询

标签 sql-server pandas pyodbc

我正在尝试使用参数化查询来避免 pyodbc 的 SQL 注入(inject);基于以下链接中指定的文档: https://code.google.com/archive/p/pyodbc/wikis/GettingStarted.wiki#Parameters

下面是数据框:

    In [57]: df
 Out[57]:
            TXN_KEY SEND_AGENT  PAY_AGENT
0     13273870  ANO080012  API352676
1     13274676  AUK359401  AED002782
2     13274871  ACL000105  ACB020203
3     13275398  AED420319  ASE094882
4     13278566  ARA030210  AII071196
5     13278955  AYM003098  AHX012817
6     13280334  AJ5020114  AED000438
7     13280512  A11171047  AEL051943
8     13281278  AOG010045  ADJ031448
9     13282118  AMX334165  APM033226
10    13283955  APL170095  AE4082002

 x=df.columns.tolist()
 x
 Out[59]: [u'TXN_KEY', u'SEND_AGENT', u'PAY_AGENT']

下面是我在 sql server 数据库中创建表的游标命令:

    cursor.execute("""Create table result (?  bigint  PRIMARY KEY  , ?  varchar(9), ?  varchar(9))""",x[0],x[1],x[2])

    ProgrammingError: ('42000', "[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near '@P1'. (102) (SQLExecDirectW)")

但是

    x[0]
    Out[63]: u'TXN_KEY'...

等等。同样,我也需要编写一个带有参数化查询的游标来更改表添加列。我知道如何执行插入、更新和选择。我以为这会是类似的,但显然不是。

最佳答案

它很难看,但由于您没有将参数绑定(bind)到列,因此您需要执行类似的操作(我已经测试过):

cursor.execute("""Create table result ({} bigint PRIMARY KEY, {} varchar(9), {} varchar(9))""".format(x[0], x[1], x[2]))

我强烈建议您在深入研究之前先了解更多有关 pyodbc 的信息。更新的文档在这里,Google Code 上的任何内容都非常过时:http://mkleehammer.github.io/pyodbc/它记录了您需要对 SELECT、INSERT、DELETE 和 UPDATE 执行的操作。最后三个需要随后的 commit() 语句。祝你好运!

关于sql-server - pyodbc 的参数化创建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37600913/

相关文章:

python - pyodbc 值错误 : month must be in 1. 。 12

sql-server - SQL Server 为每行选择最新条目

sql - 此T-SQL Update命令的SQLite 3等效语法是什么

python - 我似乎无法在 python 中处理来自 regex(re.search) 的空白结果,我要么得到重复结果,要么没有结果?

python pandas - 从面板中识别滚动最大值的行?

python - 客户端 pyodbc 错误 : "Server does not exist or access denied."

python - 使用 pyodbc cursor.executemany() 时如何获得正确的行数

c# - Linq To Entities 在 where 子句中进行错误的 SQL 转换

sql-server - 安装 SQL Server 2012 和 .Net Framework 4.5

python - 从 dict 创建数据框时防止 Pandas 解包元组