我试图理解为什么要在sqlite3中使用with(上下文管理器)。
据我所知,with
将自动提交更改,但只有当光标将创建如下:
cursor = connection.cursor()
但在sqlite3中,我可以直接执行连接本身,如下所示:
connection.execute("SQL")
#then
connection.commit()
不使用光标进行更改。
我以为上下文管理器会自动关闭连接,但它没有。所以,如果我没有在sqlite3
中创建cursor
,我需要使用with
语句吗?
此外,如果我在最后不使用connection.close()
,我也没有观察到任何差异,我可以检查某种开放连接吗?
编辑:
with slite3.connection('my_db.db") as connection:
connection.execute("SQL")
connection.commit()
connection.close()
# so in example above if I am not using cursor I just can do:
connection = sqlite3.connection('my_db.db")
connection.execute("SQL")
connection.commit()
connection.close()
# Its the same?
1条答案
按热度按时间mwg9r5ms1#
在SQLite中使用语句确实会在代码块退出后提交所做的更改。尽管如此,这只会在使用游标对象执行SQL命令时发生。当直接使用连接对象执行SQL命令时,更改必须使用connection.commit显式提交()。建议在with语句中使用游标,以确保在执行代码块后正确关闭连接。若要检查连接是否有打开的事务,可以使用sqlite3.Connection.in_transaction属性。若要查看自连接打开以来对其进行了多少更改,可以使用sqlite3.Connection.total_changes属性。