常见的执行报错:psycopg2.InternalError: CREATE DATABASE cannot run inside a transaction block
原因:不能再一个事务中创建数据库,建库操作需要在事务外部运行
原因可参考:http://initd.org/psycopg/docs/connection.html
commit()
将任何未决的事务提交到数据库。
默认情况下,Psycopg在执行第一个命令之前会打开一个事务:如果不调用commit(),则任何数据操作的效果都会丢失。
解决方案:在“自动提交”模式下设置连接:没有事务自动打开,命令立即生效。设置自动提交模式
两种方法:
一、conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT # <-- ADD THIS LINE
con = psycopg2.connect(...)
# 设置事务隔离级别
con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # <-- ADD THIS LINE
cur = con.cursor()
sql = "CREATE DATABASE {0};".format(self.db_name)
cur.execute(sql)
cur.close()
con.close()
二、con.autocommit = True
import psycopg2
con = psycopg2.connect(...)
con.autocommit = True
cur = con.cursor()
cur.execute('CREATE DATABASE {};'.format(db_name))
cur.close()
# 如果连接不关闭,则需要改回连接对象的autocommit 属性
con.autocommit = False
# 如果连接关闭,则不需要执行上面这行代码
# con.close()
本文介绍了解决在使用psycopg2模块创建数据库时遇到的“psycopg2.InternalError: CREATEDATABASE不能在事务块内运行”的错误。通过设置连接的自动提交模式,可以避免在事务中执行创建数据库的操作,确保命令立即生效。

1729

被折叠的 条评论
为什么被折叠?



