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 table
、alter table
等
但是您应该对 SELECT/INSERT/UPDATE/DELETE 语句使用参数化查询。
我正在尝试使用参数化查询来避免 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 table
、alter table
等
但是您应该对 SELECT/INSERT/UPDATE/DELETE 语句使用参数化查询。