常见的执行报错: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()