我刚刚看到了一些观点,我认为它们是一个非常巧妙的想法,但是我遇到了一个问题,因为我无法找到插入拦截触发器的行的ID。
我无法从谷歌找到太多信息,所以这里有一个问题的例子。每次插入一行时,lastrowid
都会返回0
,即使它已成功插入。有什么方法可以从触发器返回行ID吗?
import sqlite3
connection = sqlite3.connect(':memory:')
cursor = connection.cursor()
cursor.execute("""
CREATE TABLE Test(
row_id INTEGER PRIMARY KEY,
val1 INTEGER DEFAULT 0,
val2 INTEGER DEFAULT 0
)
""")
cursor.execute('CREATE View TestView AS SELECT val1, val2 FROM Test')
cursor.execute("""
CREATE TRIGGER trig INSTEAD OF INSERT ON TestView
FOR EACH ROW
BEGIN
INSERT INTO Test (val1, val2) VALUES (NEW.val1, NEW.val2);
END;
""")
insert = 'INSERT INTO TestView (val1, val2) VALUES (10, 10)'
print(cursor.execute(insert).lastrowid)
#0
insert = 'INSERT INTO TestView (val1, val2) VALUES (10, 10)'
print(cursor.execute(insert).lastrowid)
#0
insert = 'INSERT INTO TestView (val1, val2) VALUES (10, 10)'
print(cursor.execute(insert).lastrowid)
#0
如果你没有做过任何先前的插入,从那里得到0是正常的,预期的行为。
如果在触发器中发生INSERT,则只要触发器正在运行,此例程将返回插入行的rowid。触发器程序结束后,此例程返回的值将恢复为触发器触发前的值。