Получить идентификатор строки, вставленной триггером во время INSTEAD OF INSERT - PullRequest
0 голосов
/ 25 марта 2019

Я только что натолкнулся на представления и думаю, что это довольно изящная идея, однако я столкнулся с проблемой, заключающейся в том, что я не могу найти идентификатор строки, которая была только что вставлена ​​в триггер перехвата.

Я не могу найти много информации в Google, поэтому вот пример с этой проблемой. Каждый раз, когда я вставляю строку, lastrowid возвращает 0, даже если она успешно вставлена. Есть ли способ вернуть идентификатор строки из триггера?

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 голосов
/ 25 марта 2019

Если вы не делали никаких предыдущих вставок, получая 0, это нормально, ожидаемое поведение.

С документация

Если в триггере происходит INSERT, тогда эта подпрограмма будет возвращать идентификатор строки вставленной строки, пока триггер работает. После завершения программы запуска значение, возвращаемое этой подпрограммой, возвращается к тому, что было до запуска триггера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...