我有一个使用SQL Lite和Python的表。表的大小总是有3列,可能有很多行。每个单元格都是字符串。这是示例表:
serial_num date_measured status
1234A 1-1-2015 passed
4321B 6-21-2015 failed
1423C 12-25-2015 passed
...
我的程序提示我输入序列号。它保存为名为serialNum的变量。如果serialNum等于表中serial_num列中的任何字符串,我该如何删除(或覆盖)整行?
如果我知道所有该行的每个单元格中的值,我已经看过很多关于如何删除(或覆盖)表格中的行的示例,但我的麻烦在于每行中可能相同的仅单元格将是序列号。我需要搜索serial_number列,如果该列中的任何字符串等于我的serialNum变量的当前值,我需要删除(或覆盖)该行。
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE test (serial_num text, date_measured text, status text)''')
c.execute("INSERT INTO test VALUES ('1234A', '1-1-2015', 'passed')")
c.execute("INSERT INTO test VALUES ('4321B', '6-21-2015', 'failed')")
c.execute("INSERT INTO test VALUES ('1423C', '12-25-2015', 'passed')")
conn.commit()
有谁知道一个简单的方法吗?我已经看到其他人说必须使用ID或临时表,但我希望可能有更简单的方法来完成我的任务。任何建议都会很棒。
答案 0 :(得分:1)
SQL支持这个:只需使用delete
"delete from test where serial_num=<some input>;"
或在这种情况下
c.execute("delete from test where serial_num=%s;", serialNum);
使用SQL时无需搜索列表。 SQL是声明性的:你告诉它使用你的查询做什么,而不是如何做。不要遍历所有行以检查要删除的内容:告诉它要删除的内容,数据库引擎将找到满足该目标的最佳/最快方式。
答案 1 :(得分:0)
希望我能很好地解释你的问题
for row in c.execute('SELECT * FROM test WHERE serial_num = ?', serialNum'):
# do whatever you want on row
print row
答案 2 :(得分:0)
我能够找到一个可行的解决方案:
sql = "DELETE FROM test WHERE serial_num = ?"
c.execute(sql, (serialNum,))
由于某种原因,serialNum之后的逗号必须在那里。谢谢@Michiel Arien的先发制人