web-dev-qa-db-fra.com

Créez une base de données Postgres en utilisant python

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.

34
kiran6

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))
    )
55

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))
20
Álvaro Marco