使用 python 创建 Postgres 数据库

我想用 Python 创建 Postgres 数据库。

con = psql.connect(dbname='postgres',
user=self.user_name, host='',
password=self.password)


cur = con.cursor()
cur.execute("CREATE DATABASE %s  ;" % self.db_name)

我得到了以下错误:

InternalError: CREATE DATABASE cannot run inside a transaction block

我在用心理战术连接,我不明白有什么问题。 我要做的是连接到数据库(Postgres) :

psql -postgres -U UserName

然后创建另一个数据库:

create database test;

这是我经常做的事情,我想通过创建 Python 脚本来实现自动化。

47570 次浏览

使用 隔离 _ 级别 _ 自动提交,一种心理辅助工具:

发出命令时不启动事务,也不提交()或 需要回滚()。

import psycopg2
from psycopg2 import sql
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT # <-- ADD THIS LINE


con = psycopg2.connect(dbname='postgres',
user=self.user_name, host='',
password=self.password)


con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) # <-- ADD THIS LINE


cur = con.cursor()


# Use the psycopg2.sql module instead of string concatenation
# in order to avoid sql injection attacks.
cur.execute(sql.SQL("CREATE DATABASE {}").format(
sql.Identifier(self.db_name))
)

如另一个答案所示,连接必须处于自动提交模式。使用 psycopg2设置它的另一种方法是通过 autocommit属性:

import psycopg2
from psycopg2 import sql


con = psycopg2.connect(...)
con.autocommit = True


cur = con.cursor()
# sql.SQL and sql.Identifier are needed to avoid SQL injection attacks.
cur.execute(sql.SQL('CREATE DATABASE {};').format(
sql.Identifier(self.db_name)))

一个更好更简单的解决方案:

import psycopg # this uses psycopg version 3


def conection()
config = {'user':'postgres',
'password':'password_string',
'host':'127.0.0.1',
'port':'5432',
'dbname':'postgres',
'autocommit':True} #this resolve the problem "InternalError: CREATE DATABASE cannot run inside a transaction block"
try:
cnx = psycopg.connect(**config)
except psycopg.Error as err:
print(err)
exit(1)
else:
return cnx