我目前在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
谢谢,感谢任何建议或改进。这是我的个人项目,有助于提高我的编程技巧。
答案 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和所有文章之间删除的事实并不是那么糟糕。)如果你需要处于可预测的状态,那就做所有删除在同一笔交易中。 (当然,这仍然不像让数据库为你做的那样安全,因为你依赖的事实是你刚刚打的代码中没有错误,而不是依赖于没有错误的事实。数百万程序正在使用的代码中的错误。)