On Wednesday, 29 January, 2020 22:45, Peng Yu <pengyu...@gmail.com> wrote:
>In python sqlite3 program, if I call .execute() multiple times then >call .commit(). Does it ensure that all the sqlite3 commands specified >by execute()'s either all take effect or none effect? Mayhaps yes, mayhaps no. .commit() is merely syntactic sugar for .execute('COMMIT') Basically, the method does the following: if (sqlite3_get_autocommit(connection) == 0) { sqlite3_stmt* stmt = 0; sqlite3_prepare(connection, "COMMIT", -1, &stmt, NULL); if (stmt) { sqlite3_step(stmt); sqlite3_finalize(stmt); } } That is, if there is a transaction in progress on the connection, it does a commit. Mutatis mutandis for .rollback() doing a 'ROLLBACK' rather than commit. It makes sure that all changes made in the current transaction are committed to the database. If you are using "magical mode" then hopefully a transaction was started when you updated something however this is not guaranteed (such is the nature of magic). The "magical mode" of the sqlite3 wrapper decides when to BEGIN and COMMIT transactions on its own. Sometimes the magician is a little daffy though and gets it wrong so it may begin/commit/rollback whenever the magician feels like it, which may or may not be when you want. If you want to ensure that transactions BEGIN and COMMIT/ROLLBACK when *you* want them to then use explicit .execute('BEGIN') (or .execute('BEGIN IMMEDIATE') to start an immediate transaction) command to start a transaction on a connection opened with isolation_level=None. You can still use .commit() for .execute('COMMIT') and .rollback() for .execute('ROLLBAC') if you want. The connection has a property in_transaction that lets you test whether a transaction is in progress (True) or the database is in autocommit (False) mode. >In other words, if any error occurs while running the sqlite3 commands >specified in execute(), what happens? That depends on the nature of the error. If you put in a bad SQL statement (got a syntax error) then that statement did nothing. Otherwise it depends on the conflict resolution method in effect for the statement causing the error, which is usually ABORT (by default) and it just ABORTs the current statement. >Also, is .executemany() the same as calling .execute() many times? Yes. x.executemany(sql, stuff) is syntactic sugar for for e in stuff: x.execute(sql, e): -- The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume. _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users