Je veux créer une base de données Postgres en utilisant Python.
con = psql.connect(dbname='postgres',
user=self.user_name, Host='',
password=self.password)
cur = con.cursor()
cur.execute("CREATE DATABASE %s ;" % self.db_name)
Je reçois l'erreur suivante:
InternalError: CREATE DATABASE cannot run inside a transaction block
J'utilise psycopg2 pour me connecter. Je ne comprends pas quel est le problème. Ce que j'essaie de faire, c'est de me connecter à la base de données (Postgres):
psql -postgres -U UserName
Et puis créez une autre base de données:
create database test;
C'est ce que je fais habituellement et je veux automatiser cela en créant un script Python.
Utilisez ISOLATION_LEVEL_AUTOCOMMIT , une extension psycopg2:
Aucune transaction n'est démarrée lorsque la commande est émise et aucun commit () ou rollback () n'est requis.
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 attacs.
cur.execute(sql.SQL("CREATE DATABASE {}").format(
sql.Identifier(self.db_name))
)
Comme indiqué dans l'autre réponse, la connexion doit être en mode de validation automatique. Une autre façon de le configurer en utilisant psycopg2
passe par l'attribut autocommit
:
import psycopg2
con = psycopg2.connect(...)
con.autocommit = True
cur = con.cursor()
cur.execute('CREATE DATABASE {};'.format(self.db_name))