¿Por qué la conexión de DB-API de Python no tiene “comenzar” operación?
-
23-09-2019 - |
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?
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 .