2010-08-05 9 views
3

J'utilise psycopg2 pour accéder à ma base de données postgres en python. Ma fonction devrait créer une nouvelle base de données, le code ressemble à ceci:Postgres déclenche une "TRANSACTION ACTIVE SQL" (code d'erreur: 25001)

def createDB(host, username, dbname): 
    adminuser = settings.DB_ADMIN_USER 
    adminpass = settings.DB_ADMIN_PASS 

    try: 
    conn=psycopg2.connect(user=adminuser, password=adminpass, host=host) 
    cur = conn.cursor() 
    cur.execute("CREATE DATABASE %s OWNER %s" % (nospecial(dbname), nospecial(username))) 
    conn.commit() 
    except Exception, e: 
    raise e 
    finally: 
    cur.close() 
    conn.close() 

def nospecial(s): 
    pattern = re.compile('[^a-zA-Z0-9_]+') 
    return pattern.sub('', s) 

Quand j'appelle createDB mon serveur postgres génère une erreur: CREATE DATABASE ne peut pas fonctionner dans un bloc de transaction avec le code d'erreur 25001 qui signifie " TRANSACTION ACTIVE SQL ".

Je suis assez sûr qu'il n'y a pas d'autre connexion en cours d'exécution en même temps et chaque connexion que j'ai utilisée avant d'appeler createDB est éteint.

Répondre

3

Il semble que votre curseur() est en fait une transaction: http://initd.org/psycopg/docs/cursor.html#cursor

Cursors created from the same connection are not isolated, i.e., any changes done to the database by a cursor are immediately visible by the other cursors. Cursors created from different connections can or can not be isolated, depending on the connections’ isolation level. See also rollback() and commit() methods.

Passer le curseur et juste exécuter votre requête. Drop commit() aussi, vous ne pouvez pas valider quand vous n'avez pas de transaction ouverte.

+0

Merci de m'avoir mis dans la bonne direction. La solution est décrite ici: http://lists.initd.org/pipermail/psycopg/2002-February/000758.html – Kai

+1

Désolé, c'était la solution si vous utilisez psycopg1, pour psycopg2 au lieu de conn.autocommit() conn.set_isolation_level (psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) et cela devrait fonctionner. – Kai