es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear una base de datos utilizando psycopg3?

Esto no funciona:

conn = psycopg.connect(dsn)
conn.execute("CREATE DATABASE test")

Aquí está la documentación sobre transacciones en psycopg3: https://www.psycopg.org/psycopg3/docs/basic/transactions.html

La declaración más importante para este problema:

Psycopg tiene un comportamiento que puede parecer sorprendente en comparación con psql: por defecto, cualquier operación en la base de datos iniciará una nueva transacción.

Es una página bastante larga, pero no indica en ningún lugar cómo ejecutar una declaración sin iniciar una nueva transacción. Hay un argumento autocommit=True para connect(), pero tampoco funciona.

No importa lo que haga, siempre obtengo este error:

psycopg.errors.ActiveSqlTransaction: CREATE DATABASE no se puede ejecutar dentro de un bloque de transacción

¿Cómo puedo crear una base de datos con psycopg3?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según la documentación, no es posible ejecutar la instrucción CREATE DATABASE sin iniciar una nueva transacción. Sin embargo, existe una solución alternativa para esto.

    Puedes utilizar la opción ISOLATION_LEVEL_AUTOCOMMIT para establecer la conexión en modo de autocommit. Esto significa que cada instrucción se ejecutará en su propia transacción y se confirmará inmediatamente.

    Aquí tienes un ejemplo de código:

    import psycopg
    
    # Establecer la conexión en modo de autocommit
    conn = psycopg.connect(dsn)
    conn.set_isolation_level(psycopg.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
    
    # Ejecutar la instrucción CREATE DATABASE
    cur = conn.cursor()
    cur.execute("CREATE DATABASE test")
    cur.close()
    
    # Cerrar la conexión
    conn.close()
    

    Al establecer el nivel de aislamiento en ISOLATION_LEVEL_AUTOCOMMIT, la instrucción CREATE DATABASE se ejecutará en su propia transacción y se confirmará inmediatamente.

Comments are closed.