2010-10-20 33 views
14

Tôi có một vấn đề với xoá một bản ghi từ cơ sở dữ liệu sqlite3:Làm thế nào để xóa bản ghi khỏi bảng?

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 

Tất cả là tốt, nhưng xóa không hoạt động! Có ai đó có ý tưởng nào không?

+2

chính xác thì không hoạt động? bạn đang sử dụng phiên bản python nào? – SilentGhost

+0

Tôi đang sử dụng python 3.1 – Risino

+2

Tuyệt vời, vì vậy những gì * xóa không hoạt động * thực sự có nghĩa là gì? – SilentGhost

Trả lời

-4

Cảm ơn mọi người đã cố gắng trợ giúp. Mã bản quyền là:

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

Điều này dễ bị tấn công SQL injection! – thirtythreeforty

-2

Kiểm tra quyền của tệp.

Một sang một bên, tôi thích phương pháp tokenized:

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

Vui lòng nhập tên: ... ''; DROP TABLE Zoznam;' eumiro

+0

Bạn làm sạch tất cả đầu vào trước khi chạy nó qua con trỏ. Nó không khác gì so với những gì đã có. –

+0

cũng, tên mà tôi yêu cầu không xóa từ SQL – Risino

-1

Tôi khuyên bạn trước tiên hãy một chuỗi cho truy vấn, và sau đó thực hiện nó. ví dụ:

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

nghiêm túc, nơi nào các bạn có ý tưởng như vậy? – SilentGhost

+0

Tôi không biết tại sao, nhưng tôi gặp nhiều vấn đề khi cố gắng thực hiện các truy vấn trong sqlite kèm theo truy vấn chuỗi thực tế làm đối số đầu tiên của phương thức execute, nhưng bằng cách nào đó tôi có thể giải quyết vấn đề này. nó vào phương thức thực hiện. – Kelmer

+1

Như đã lưu ý trong câu trả lời ở trên, * luôn * sử dụng phiên bản tham số của lệnh sqlite thay vì tạo chuỗi truy vấn bằng tay. Điều này sẽ ngăn chặn (hoặc ít nhất là làm giảm nguy cơ) cho tiêm SQL. – shiin

13

Cú pháp đúng cho một truy vấn parameterized là:

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

Hãy chắc chắn rằng các tham số sử dụng dấu phẩy, để làm cho nó một tuple python.

Điều này sẽ giúp ngăn chặn SQL Injection có thể xảy ra khi chuyển vào chuỗi được định dạng. Thông tin thêm về SQL Injection here

Bài liên quan here.

+0

có lỗi đánh máy với ký tự cuối cùng trong chuỗi. Khung phải được loại bỏ. Tôi không thể chỉnh sửa vì các chỉnh sửa cần phải có 6 ký tự. –

+0

Rất tiếc! Cảm ơn! Đã sửa. –

0

Hãy thử với:

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

Nếu không có '' và '?' giữa '()'

Các vấn đề liên quan