pyodbc的参数化创建查询

时间:2016-06-02 19:52:41

标签: sql-server pandas pyodbc

我正在尝试使用参数化查询来避免pyodbc的SQL注入;基于以下链接中指定的文档: 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命令:

    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'...

等等。同样,我也需要为alter table add列编写一个带参数化查询的游标。我知道如何进行插入,更新和选择。我认为这将是类似的路线,但显然不是。

2 个答案:

答案 0 :(得分:1)

这很难看,但由于你没有将参数绑定到列,你需要做这样的事情(我已经测试过了):

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

我强烈建议在深入挖掘之前更多地了解pyodbc。更新后的文档在此处,Google代码上的任何内容都已过时:http://mkleehammer.github.io/pyodbc/它记录了您需要为SELECT,INSERT,DELETE和UPDATE执行的操作。最后三个后来需要commit()语句。祝你好运!

答案 1 :(得分:1)

您只能将参数用于literals

除了文字之外,您不能将它用于表名,列名或SQL的任何其他部分。

除此之外,您不能也不应该将其用于DDL s - 例如create tablealter table等。

但是你应该对SELECT / INSERT / UPDATE / DELETE语句使用参数化查询。