如果单元格已存在,则搜索SQL表并删除行

时间:2015-07-28 14:56:19

标签: python sql sqlite

我有一个使用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或临时表,但我希望可能有更简单的方法来完成我的任务。任何建议都会很棒。

3 个答案:

答案 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的先发制人