Объедините файлы SQLite в один файл базы данных и задайте вопрос «begin / commit»

Этот пост ссылается на эту страницу для слияния баз данных SQLite.

Последовательность следующая. Допустим, я хочу объединить a.db и b.db. В командной строке я делаю следующее:

  • sqlite3 a.db
  • прикрепите 'b.db' как toM;
  • начало;
  • вставить в тестовый тест select * from toM.benchmark;
  • commit;
  • отсоединить базу данных от M;

Это работает хорошо, но на указанном сайте спрашивающий спрашивает о повышении скорости, и в ответ следует использовать команды «начать» и «зафиксировать».

Затем я придумал следующий код на Python, чтобы сделать то же самое. Я абстрагирую вызовы функций SQLite с помощью SQLiteDB, и один из его методов - runCommand (). У меня та же ошибка, хотя я удалил 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)

Но я получил следующую ошибку.

OperationalError: cannot commit - no transaction is active

Несмотря на то, что ошибка, db результата хорошо слита. А без начала / фиксации ошибок вообще нет.

  • Почему я не могу выполнить команду begin / commit?
  • Абсолютно необходимо ли запускать begin / commit для безопасного слияния файлов db? В сообщении говорится, что цель begin / commit - ускорение. Тогда что' В чем разница между использованием и неиспользованием команды begin / commit с точки зрения ускорения?

5
задан Community 23 May 2017 в 12:25
поделиться