我应该为每个 Sqlite3 事务调用 connect() 和 close() 吗?
Should I call connect() and close() for every Sqlite3 transaction?
我想编写一个 Python 模块来为我的应用程序抽象出数据库事务。我的问题是我是否需要为每笔交易调用 connect()
和 close()
?在代码中:
import sqlite3
# Can I put connect() here?
conn = sqlite3.connect('db.py')
def insert(args):
# Or should I put it here?
conn = sqlite3.connect('db.py')
# Perform the transaction.
c = conn.cursor()
c.execute(''' insert args ''')
conn.commit()
# Do I close the connection here?
conn.close()
# Or can I close the connection whenever the application restarts (ideally, very rarely)
conn.close()
我在数据库方面经验不多,所以我希望能解释一下为什么一种方法优于另一种方法。
使用单连接会更快,操作上应该没问题。
如果你想确保关闭最终发生(即使你的程序被异常终止),请使用 atexit
模块。具体来说,import atexit
在程序开始时,atexit.register(conn.close)
在 connect
之后——注意,no ()
在 close
,你想注册程序存在时要调用的函数(无论是正常还是通过异常),不到调用函数。
不幸的是,如果 Python 应该崩溃,例如由于 Python 无法捕获的 C 编码模块中的错误,或 kill -9
等,注册的退出函数(s) 可能最终不会被调用。幸运的是,在这种情况下它无论如何都不应该受到伤害(除了这种情况,有人希望,这是一种罕见和极端的情况)。
您可以重复使用同一个连接。您还可以将连接(和游标)用作上下文管理器,这样您就不需要显式调用 close
。
def insert(conn, args):
with conn.cursor() as c:
c.execute(...)
conn.commit()
with connect('db.py') as conn:
insert(conn, ...)
insert(conn, ...)
insert(conn, ...)
没有理由关闭与数据库的连接,而且每次重新打开连接的代价都很高。 (例如,您可能需要建立 TCP 会话以连接到远程数据库。)
我想编写一个 Python 模块来为我的应用程序抽象出数据库事务。我的问题是我是否需要为每笔交易调用 connect()
和 close()
?在代码中:
import sqlite3
# Can I put connect() here?
conn = sqlite3.connect('db.py')
def insert(args):
# Or should I put it here?
conn = sqlite3.connect('db.py')
# Perform the transaction.
c = conn.cursor()
c.execute(''' insert args ''')
conn.commit()
# Do I close the connection here?
conn.close()
# Or can I close the connection whenever the application restarts (ideally, very rarely)
conn.close()
我在数据库方面经验不多,所以我希望能解释一下为什么一种方法优于另一种方法。
使用单连接会更快,操作上应该没问题。
如果你想确保关闭最终发生(即使你的程序被异常终止),请使用 atexit
模块。具体来说,import atexit
在程序开始时,atexit.register(conn.close)
在 connect
之后——注意,no ()
在 close
,你想注册程序存在时要调用的函数(无论是正常还是通过异常),不到调用函数。
不幸的是,如果 Python 应该崩溃,例如由于 Python 无法捕获的 C 编码模块中的错误,或 kill -9
等,注册的退出函数(s) 可能最终不会被调用。幸运的是,在这种情况下它无论如何都不应该受到伤害(除了这种情况,有人希望,这是一种罕见和极端的情况)。
您可以重复使用同一个连接。您还可以将连接(和游标)用作上下文管理器,这样您就不需要显式调用 close
。
def insert(conn, args):
with conn.cursor() as c:
c.execute(...)
conn.commit()
with connect('db.py') as conn:
insert(conn, ...)
insert(conn, ...)
insert(conn, ...)
没有理由关闭与数据库的连接,而且每次重新打开连接的代价都很高。 (例如,您可能需要建立 TCP 会话以连接到远程数据库。)