pyodbc 的参数化创建查询

Parameterized create query for pyodbc

我正在尝试使用参数化查询来避免 SQL pyodbc 注入;基于以下 link 中指定的文档: 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 服务器数据库中创建 table 的游标命令:

    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 column 编写一个带有参数化查询的游标。我知道如何为插入、更新和 select 执行此操作。我以为这会是类似的路线,但显然不是。

它很丑陋,但由于您没有将参数绑定到列,因此您需要做这样的事情(我已经测试过了):

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() 语句。祝你好运!

您只能为 literals 使用参数。

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

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

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