This post hace referencia a este page para fusionar bases de datos SQLite.Combinar archivos SQLite en un archivo db, y la pregunta 'begin/commit'
La secuencia es la siguiente. Digamos que quiero fusionar a.db y b.db. En la línea de comando, hago lo siguiente.
- sqlite3 a.db
- adjuntar 'b.db' como Tom;
- begin; < -
- inserte en el banco de pruebas seleccione * de toM.benchmark;
- commit; < -
- separar la base de datos aM;
Funciona bien, pero en el sitio referido, el interlocutor pregunta acerca de la aceleración, y la respuesta es usar el comando 'comenzar' y 'confirmar'.
Luego, se me ocurrió el siguiente código python para hacer exactamente lo mismo. Resumo las llamadas a la función SQLite con SQLiteDB, y uno de sus métodos es runCommand(). Obtuve el mismo error aunque eliminé el archivo self.connector.commit().
# run command
def runCommand(self, command):
self.cursor.execute(command)
self.connector.commit() # same error even though I delete this line
db = SQLiteDB('a.db')
cmd = "attach \"%s\" as toMerge" % "b.db"
print cmd
db.runCommand(cmd)
cmd = "begin"
db.runCommand(cmd)
cmd = "insert into benchmark select * from toMerge.benchmark"
db.runCommand(cmd)
cmd = "commit"
db.runCommand(cmd)
cmd = "detach database toMerge"
db.runCommand(cmd)
Pero me sale el siguiente error.
OperationalError: cannot commit - no transaction is active
Aunque el error, el resultado db está bien fusionado. Y sin el inicio/compromiso, no hay ningún error en absoluto.
- ¿Por qué no puedo ejecutar el comando begin/commit?
- ¿Es absolutamente necesario ejecutar begin/commit para fusionar de forma segura los archivos db? La publicación dice que el propósito de comenzar/comprometer es para acelerar. Entonces, ¿cuál es la diferencia entre usar y no usar el comando begin/commit en términos de aceleración?
@prosseek Parece que el método 'execute' de los cursores no puede ejecutar la instrucción 'commit'. Esto no es gran cosa porque puedes usar el método 'commit' en el objeto de conexión. – aaronasterling