Pregunta

Trabajo con los cursores en MySQL-python que solía llamar "BEGIN;", "COMMIT;", y "ROLLBACK;" explícitamente como sigue:

try:
    cursor.execute("BEGIN;")
    # some statements
    cursor.execute("COMMIT;")
except:
    cursor.execute("ROLLBACK;")

entonces, descubrí que el objeto de conexión subyacente tiene los métodos correspondientes:

try:
    cursor.connection.begin()
    # some statements
    cursor.connection.commit()
except:
    cursor.connection.rollback()

PEP DB-API descubrí que no lo hace mencionar el método begin () para el objeto de conexión, incluso para las extensiones.

Mysql-pitón, dicho sea de paso, lanza el DeprecationWarning, cuando se utiliza el método. sqlite3.connection, por ejemplo, no tiene el método en absoluto.

Y la pregunta es por qué no hay tal método en el PEP? Es la declaración de alguna manera opcional, ¿es suficiente para invocar commit () en su lugar?

¿Fue útil?

Solución 2

decidido responder a mí mismo:

A hilo sobre API DB 2.0 transacciones en python-lista y el siguiente extracto del libro notable SQL The Complete Reference me hacen pensar que implementa la API DB SQL1 comportamiento estándar:

  

La primera versión del estándar SQL   (SQL1) define una transacción implícita   modo, basado en la transacción   apoyar en las primeras versiones de DB2.   En el modo implícito, y sólo el COMMIT   ROLLBACK son compatibles. UNA   transacciones de SQL se inicia automáticamente   con la primera instrucción SQL ejecutada   por un usuario o un programa y extremos cuando una   COMMIT o ROLLBACK se ejecuta. los   final de una transacción implícitamente   comienza una nueva.

modo de transacción explícita (el SQL2 y SQL: 1999). Parece ser útil cuando el modo de confirmación automática soportes RDBSM y la conexión actual es en ese modo, pero API DB simplemente no lo refleja

Otros consejos

un pedido previamente a esta pregunta . En general, el "protocolo" para usar con las transacciones es:

cursor = conn.cursor()
try:
    cursor.execute(...)
except DatabaseError:
    conn.rollback()
    raise
else:
    conn.commit()
finally:
    cursor.close()

A partir de Python 2.6 sqlite objetos Connection se pueden utilizar como gestores de contexto que se comprometen de forma automática o transacciones de rollback .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top