是否可以将单个MySQLdb连接用于多个事务而不关闭它们之间的连接?换句话说,就像这样:
conn = MySQLdb.connect(host="1.2.3.4", port=1234, user="root", passwd="x", db="test")
for i in range(10):
try:
cur = conn.cursor()
query = "DELETE FROM SomeTable WHERE ID = %d" % i
cur.execute(query)
cur.close()
conn.commit()
except Exception:
conn.rollback()
conn.close()
似乎工作正常,但我只想仔细检查。
答案 0 :(得分:18)
我认为这里有什么构成交易存在误解。
您的示例打开一个连接,然后在其上执行一个事务。您在该事务中执行多个SQL语句,但在提交后完全关闭它。当然,这还不错。
执行多个事务(而不仅仅是SQL语句),如下所示:
conn = MySQLdb.connect(host="1.2.3.4", port=1234, user="root", passwd="x", db="test")
for j in range(10):
try:
for i in range(10):
cur = conn.cursor()
query = "DELETE FROM SomeTable WHERE ID = %d" % i
cur.execute(query)
cur.close()
conn.commit()
except Exception:
conn.rollback()
conn.close()
上面的代码提交了10个事务,每个事务由10个单独的删除语句组成。
是的,只要您不在线程之间共享该连接,您应该能够毫无问题地重新使用开放连接。
例如,SQLAlchemy通过合并它们来重新使用连接,根据需要向应用程序分发打开的连接。在应用程序的整个生命周期内,这些连接都会执行新事务和新语句,而无需在关闭应用程序之前关闭它们。
答案 1 :(得分:0)
最好首先构建一个查询字符串,然后执行该单个MySQL语句。例如:
query = "DELETE FROM table_name WHERE id IN ("
for i in range(10):
query = query + "'" + str(i) + "', "
query = query[:-2] + ')'
cur = conn.cursor()
cur.execute(query)