我实现了这段代码来创建一个池连接:
def create_global_connection(minconn, maxconn, _pgconnstr):
global g_connection
g_connection = psycopg2.pool.SimpleConnectionPool(minconn, maxconn, _pgconnstr)
# global_connection.autocommit = True
@contextmanager
def getcursor():
global g_connection
conn = g_connection.getconn()
try:
yield conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
finally:
g_connection.putconn(conn)
我选择这样的选择:
with getcursor() as cur:
cur.execute("SELECT * FROM %s;" % (table))
我的问题是,连接和执行是否需要提交(在create_global_connection中注释掉的行)?
答案 0 :(得分:1)
以下是有关交易的psycopg2文档的链接:
http://initd.org/psycopg/docs/usage.html#transactions-control
引用文档:
当连接退出with块时,如果块没有引发异常,则提交事务。如果发生异常,则回滚事务。
当光标退出with块时,它会关闭,释放最终与之关联的任何资源。交易状态不受影响。
请注意,与文件对象或其他资源不同,退出连接的块不会关闭连接,只会关闭与之关联的事务:连接可以在多个with语句中使用,每个with块都有效地包装在单独的交易中
如上所述,您的代码将执行select,但光标将关闭,除非您在with块中使用它。 with构造仅适用于2.5或更高版本。