根据表的参考数据删除表中的所有内容

时间:2014-07-23 23:34:34

标签: python sql sqlite

我目前在DB中有2个SQLite3表。从Table1中删除一个公司名称后,我想删除表2中与公司名称相关的所有新闻文章。代码在Python 2.7中使用PyQt4。

if currentRow > -1:
    currentComp = (self.tableWidget.item(currentRow, 0).text(), )
    self.dbCursor.execute('''DELETE FROM Table1 WHERE comp=?''', currentComp)
    self.dbCursor.execute('''DELETE FROM Table2 WHERE comp=?''', currentComp)
    self.dbConn.commit()
    self.tableWidget.removeRow(currentRow)

第二个SQL查询错误。如何根据从第一个表中删除的公司名称删除多个新闻文章?

更新了架构

表2

INTEGER PRIMARY KEY,comp TEXT,pdate TEXT,ptime TEXT,title TEXT,link TEXT

表1

INTEGER PRIMARY KEY,名称TEXT,comp TEXT

谢谢,感谢任何建议或改进。这是我的个人项目,有助于提高我的编程技巧。

1 个答案:

答案 0 :(得分:2)

理想情况下,根本不要编写此代码。使用数据库的一个原因是它可以自动完成所有这些工作。因此,如果要强制执行一致性约束,请在数据库模式中执行此操作。例如:

CREATE TABLE Company (
    id PRIMARY KEY AUTOINCREMENT,
    name)

CREATE TABLE Article (
    id PRIMARY KEY AUTOINCREMENT,
    name,
    text,
    company REFERENCES Company(id) ON DELETE CASCADE)

现在,当您删除公司#15时,它会自动删除公司#15的所有文章,或者,如果由于某种原因无法执行此操作,整个语句将失败,您将收到明确的错误消息,一切都不会改变。


如果您真的必须手动执行此操作,请务必在公司之前删除文章;这样,如果它在中间失败,你就不会处于可预测的状态,但至少你还处于一致的状态。 (并且,既然你试图删除公司的所有文章,那么你在0和所有文章之间删除的事实并不是那么糟糕。)如果你需要处于可预测的状态,那就做所有删除在同一笔交易中。 (当然,这仍然不像让数据库为你做的那样安全,因为你依赖的事实是你刚刚打的代码中没有错误,而不是依赖于没有错误的事实。数百万程序正在使用的代码中的错误。)