2010-10-20 2 views
14

У меня есть проблемы с удалением записей из базы данных sqlite3:Как удалить запись из таблицы?

conn = sqlite3.connect('databaza.db') 
c = conn.cursor() 
data3 = str(input('Please enter name: ')) 
mydata = c.execute('DELETE FROM Zoznam WHERE Name=?', (data3,)) 
conn.commit() 
c.close 

Все это хорошо, но удалить не работает! У кого-нибудь есть идея?

+2

что именно не работает? какую версию python вы используете? – SilentGhost

+0

Я использую python 3.1 – Risino

+2

Отлично, так что делает * delete не работает * на самом деле означает? – SilentGhost

ответ

-4

Спасибо всем, кто пытался помочь. Правильный код:

conn = sqlite3.connect('databaza.db') 
c = conn.cursor() 
conn.text_factory = str  
data3 = str(input('Please enter name: ')) 
query = "DELETE FROM Zoznam WHERE Name = '%s';" % data3.strip() 
print(query) 
mydata = c.execute(query) 
+14

Это уязвимо для SQL-инъекций! – thirtythreeforty

-2

Проверьте права доступа к файлам.

В сторону, я предпочитаю токенизированный метод:

mydata = c.execute("DELETE FROM Zoznam WHERE Name='%s'" % data3) 
+11

Пожалуйста, введите имя: ... ''; DROP TABLE Zoznam;' eumiro

+0

Вы очищаете все входные данные до запуска его через курсор. Это ничем не отличается от того, что уже существует. –

+0

также, имя, которое я прошу не стереть с SQL – Risino

-1

Я советую вам сначала сделать строку для запроса, а затем выполнить его. ex:

query = "delete from zoznam where name = '%s' " % data3 
c.execute(query) 
conn.commit() 
+7

серьезно, где вы получаете такие идеи? – SilentGhost

+0

Я не знаю почему, но у меня было много проблем с выполнением запросов в sqlite, содержащих фактический строковый запрос в качестве первого аргумента метода execute, но каким-то образом я мог решить эту проблему, создав переменную из строки, а затем передал это метод выполнения. – Kelmer

+1

Как отмечено в приведенном выше ответе, * всегда * используйте параметризованную версию команд sqlite вместо того, чтобы вручную создавать строки запроса. Это предотвратит (или, по крайней мере, значительно уменьшит риск) для инъекций SQL. – shiin

13

Правильный синтаксис для parameterized запроса:

mydata = c.execute("DELETE FROM Zoznam WHERE Name=?", (data3,)) 

Убедитесь, что параметр использует запятую, чтобы сделать его питон кортеж.

Это поможет предотвратить SQL-инъекцию, которая возможна при передаче в форматированной строке. Дополнительная информация о SQL Injection here

Связанное сообщение here.

+0

есть опечатка с последним символом в строке. Скоба должна быть удалена. Я не могу редактировать его, так как редактирование должно быть 6 символов. –

+0

Упс! Благодаря! Исправлена. –

0

Try с:

mydata = c.execute('DELETE FROM Zoznam WHERE Name = (?)', (data3)) 

Без '' и '?' между '()'

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