2016-06-02 6 views
2

Я пытаюсь использовать параметризованный запрос, чтобы избежать SQL-инъекции для pyodbc; на основании документации, указанной в приведенной ниже ссылке: https://code.google.com/archive/p/pyodbc/wikis/GettingStarted.wiki#ParametersПараметрированный запрос создания для pyodbc

Ниже dataframe:

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

И так далее. Точно так же мне нужно написать курсор с параметризованным запросом для столбца add table. Я знаю, как это сделать для вставки, обновления и выбора. Я думал, что это будет аналогично, но это явно не так.

ответ

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

Вы можете использовать параметры только для literals.

Вы не можете использовать его для имен таблиц, имен столбцов или любых других частей SQL, кроме литералов.

Кроме этого вы не можете и не должны использовать его для DDL с - как create table, alter table и т.д.

Но вы должны использовать параметризованные запросы для SELECT/INSERT/UPDATE/DELETE заявления.

 Смежные вопросы

  • Нет связанных вопросов^_^