2014-11-12 3 views
0

Я делаю вставку в свою БД, и я вставляю строку с адресом электронной почты.ValueError при вставке в базу данных

Что-то вроде этого:

cur.execute("insert into client values(%s,%s,%s,%s)",(name, email, date,int(age))) 

Затем, когда переменная email является '[email protected]', Python бросает мне это сообщение

ValueError: invalid literal for int() with base 10: [email protected] 

Моя база данных имеет следующие метаданные:

name = varchar 
email = varchar 
date = date 
age = integer 

Кто-нибудь знает, что происходит?

+0

для int its% d not% s – Hackaholic

+3

Я думаю, вы хотите '% d' для int. Но ваше сообщение об ошибке, похоже, указывает, что «возраст» на самом деле «[email protected]». – Madbreaks

+0

Я думал, что слишком, но, похоже, не нашел, почему моя возрастная переменная является моей электронной почтой, так как я следил за повсюду, делая отпечатки, и каждый раз, когда она следует за переменной как строка – AbdulHamid

ответ

1

Эта ошибка исходит от Python, а не SQL.

Как-то, имя age равно строке '[email protected]'. Итак, когда вы делаете int(age), вы получаете ValueError:

>>> age = '[email protected]' 
>>> int(age) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '[email protected]' 
>>> 

Вы должны найти, где вы случайно назначен age на адрес электронной почты и исправить. Я не могу точно сказать, как вы это сделали, потому что код не размещен, но обычно это происходит из-за того, что вы неправильно распаковали итерацию. Что-то вроде:

name, email, date, age = ['Joe', 20, '11/12/2014', '[email protected]'] 

, которые должны быть:

name, age, date, email = ['Joe', 20, '11/12/2014', '[email protected]'] 

Кроме того, вы никогда не должны использовать строку форматирования для создания команд SQL. Вместо этого, передавать аргументы в виде кортежа и использовать ? ссылаться на них:

cur.execute("insert into client values(?,?,?,?)", (name, email, date, age)) 

От docs:

Обычно ваши операции SQL нужно будет использовать значения из Python переменных. Вы не должны собирать свой запрос, используя строку Python , потому что это небезопасно; это делает вашу программу уязвимой для атаки SQL-инъекции (см. http://xkcd.com/327/ для юмористический пример того, что может пойти не так).

+0

спасибо! проблема была в моем объекте клиента изменена электронная почта с возрастом жаль! в любом случае пытался сменить код sql? ? но драйвер postgres не работает с этим! – AbdulHamid

0

Никогда не записывайте INSERT заявления типа

INSERT INTO Client VALUES (?, ?, ?, ?) 

Вместо написать

INSERT INTO Client (Name, EmailAddress, StartDate, Age) VALUES (?, ?, ?, ?) 

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

Также, применяя SQL-выражения таким образом, вы используете нетипизированные ? заполнители для параметров, переданных в оператор.Эти параметры затем будут привязаны к оператору в безопасном типе SQL-инъекции без необходимости беспокоиться об исключении внутренних кавычек в именах (например).

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