获取在INSTEAD OF INSERT期间由触发器插入的行的ID

时间:2019-03-25 17:21:10

标签: python view sqlite

我刚刚遇到过各种视图,我认为它们是一个很好的主意,但是我遇到了一个问题,因为我无法找到刚刚插入到拦截触发器中的行的ID。

我无法从Google找到很多信息,所以这里有一个例子。每次插入一行时,即使插入成功,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

1 个答案:

答案 0 :(得分:0)

如果您以前没有做过任何插入操作,那么从该插入中获得0是正常的预期行为。

来自the documentation

  

如果在触发器内发生INSERT,则只要触发器正在运行,此例程将返回插入行的rowid。触发器程序结束后,此例程返回的值将还原为触发触发器之前的值。