2017-01-11 18 views
0

Предположим, что у меня есть my_table в SQL Server, как это:Экранирование символов в строке SQL для pypyodbc

CREATE TABLE my_table 
    (col1 VARCHAR(100), 
    col2 VARCHAR(100), 
    col3 INT) 

Я попытался вставить несколько записей в этой таблице, используя Python 3.5 и pypyodbc библиотеку, как показано ниже:

import pypyodbc 
connection = pypyodbc.connect('Driver={SQL Server};' 'Server=12.3.456.789.0123;' 'Database=mydb;' 'uid=me;pwd=mypwd') 
cursor= connection.cursor() 
data = [{'p1': "I'm hungry", 'p2': "text for col2", 'p3': '1234'}] 
for dd in data: 
    insert_sql = "INSERT INTO my_table (col1,col2,col3) VALUES (%s, %s, %s)" 
    cursor.execute(insert_sql, (dd['p1'], dd['p2'], dd['p3'])) 

Но когда приведенный выше код выполняется, он возвращает:

pypyodbc.ProgrammingError: ('HY000', 'The SQL contains 0 parameter markers, but 3 parameters were supplied') 

Я не знаю, что я делаю неправильно. Если бы кто-нибудь мог помочь мне разрешить это, я был бы очень благодарен за помощь!

ответ

1

Проблема в том, что вы используете% s placeholder, как в python или на другом языке программирования. Однако pypyodbc использует? как заполнитель (маркер параметра). Просто замените% s на?, Ваш код должен работать нормально.

import pypyodbc 
connection = pypyodbc.connect('Driver={SQL Server};' 'Server=12.3.456.789.0123;' 'Database=mydb;' 'uid=BenchmarkingUS;pwd=mypwd') 
cursor= connection.cursor() 
data = [{'p1': "I'm hungry", 'p2': "text for col2", 'p3': 1234}] 
for dd in data: 
    insert_sql = "INSERT INTO phyo_test (col1,col2,col3) VALUES (?, ?, ?)" 
    cursor.execute(insert_sql, (dd['p1'], dd['p2'], dd['p3'])) 
cursor.commit() 

Примечание: Вы устанавливаете значение p3 как строку '1234', которая не дает ошибок. Но лучше изменить его на int 1234, чтобы предотвратить ошибки типа данных.

+0

спасибо! Я не понимал, что 'pypyodbc' будет использовать'? '(Вроде неожиданного, если в стандартном форматировании строки Python используется'% '). Это решило проблему. :) – user1330974