Perché la connessione a DB-API di Python non ha “iniziare” il funzionamento?
-
23-09-2019 - |
Domanda
Lavorare con i cursori in MySQL-python ho usato per chiamare "BEGIN;", "commit;", e "ROLLBACK;" esplicitamente come segue:
try:
cursor.execute("BEGIN;")
# some statements
cursor.execute("COMMIT;")
except:
cursor.execute("ROLLBACK;")
poi, ho scoperto che l'oggetto connessione sottostante ha i metodi corrispondenti:
try:
cursor.connection.begin()
# some statements
cursor.connection.commit()
except:
cursor.connection.rollback()
DB-API ho scoperto che non è così menzionano il metodo iniziare () per l'oggetto di connessione, anche per le estensioni.
Mysql-python, tra l'altro, tiri il DeprecationWarning, quando si utilizza il metodo. sqlite3.connection, per esempio, non ha il metodo a tutti.
E la domanda è il motivo per cui non v'è tale metodo nel PEP? È la dichiarazione in qualche modo opzionale, è sufficiente per invocare commit () invece?
Soluzione 2
Ha deciso di rispondere a me stesso:
Un thread su DB API 2.0 transazioni in python-list e il seguente estratto dal libro evidente SQL il riferimento completo mi fanno pensare che DB API implementa comportamento standard SQL1:
La prima versione dello standard SQL (SQL1) ha definito una transazione implicita modalità, sulla base della transazione supporto nelle prime release di DB2. In modo implicito, solo il commit e Sono supportati ROLLBACK. UN transazioni SQL inizia automaticamente con la prima istruzione SQL eseguita da un utente o un programma e termina quando un Commettere o eseguito ROLLBACK. Il termine di una transazione implicitamente inizia uno nuovo.
modalità di transazione esplicita (lo SQL2 e SQL: 1999). Sembra essere a portata di mano quando il RDBSM supporta la modalità autocommit e la connessione corrente è in tale modalità, ma DB API semplicemente non riflette lo
Altri suggerimenti
una tale precedenza ha chiesto domanda . Generalmente il "protocollo" da utilizzare con le transazioni è:
cursor = conn.cursor()
try:
cursor.execute(...)
except DatabaseError:
conn.rollback()
raise
else:
conn.commit()
finally:
cursor.close()
A partire da Python 2.6 SQLite oggetti Connection
possono essere utilizzati come gestori di contesto che si impegnano in modo automatico o transazioni rollback .