New submission from Jim Minter: sqlite3 doesn't populate the lastrowid member of the Cursor object when a SQL REPLACE statement is executed.
The following snippet doesn't work as I would expect: cursor = db.execute("REPLACE INTO table(column) VALUES ('datum')") print cursor.lastrowid # prints None The following snippet, with SQL which is in effect identical to SQLite, does work as expected: cursor = db.execute("INSERT OR REPLACE INTO table(column) VALUES ('datum')") print cursor.lastrowid # prints some rowid Looking at Modules/_sqlite/cursor.c, in _pysqlite_query_execute(), the following snippet is found: if (!multiple && statement_type == STATEMENT_INSERT) { Py_BEGIN_ALLOW_THREADS lastrowid = sqlite3_last_insert_rowid(self->connection->db); Py_END_ALLOW_THREADS self->lastrowid = PyLong_FromLong((long)lastrowid); } else { Py_INCREF(Py_None); self->lastrowid = Py_None; } I suggest this should read something like: if (!multiple && (statement_type == STATEMENT_INSERT || statement_type == STATEMENT_REPLACE)) { instead of: if (!multiple && statement_type == STATEMENT_INSERT) { Thanks, Jim ---------- components: Library (Lib) messages: 179049 nosy: jim_minter priority: normal severity: normal status: open title: sqlite3.Cursor.lastrowid isn't populated when executing a SQL REPLACE statement type: enhancement versions: Python 2.7, Python 3.3 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue16864> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com