This post đề cập đến việc page này để hợp nhất cơ sở dữ liệu SQLite.Hợp nhất các tệp SQLite vào một tệp db và câu hỏi 'bắt đầu/cam kết'
Trình tự như sau. Giả sử tôi muốn hợp nhất a.db và b.db. Trong dòng lệnh tôi làm như sau.
- sqlite3 a.db
- đính kèm 'b.db' như Tom;
- bắt đầu; < -
- chèn vào điểm chuẩn * từ toM.benchmark;
- cam kết; < -
- tách cơ sở dữ liệu thành M;
Nó hoạt động tốt, nhưng trong trang được giới thiệu, người hỏi hỏi về tăng tốc và câu trả lời là sử dụng lệnh 'bắt đầu' và 'cam kết'.
Sau đó, tôi đã đưa ra mã python sau để làm điều tương tự. Tôi tóm tắt các lời gọi hàm SQLite với SQLiteDB và một trong số đó là phương thức runCommand(). Tôi đã nhận được lỗi tương tự mặc dù tôi xóa 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)
Nhưng, tôi nhận được lỗi sau.
OperationalError: cannot commit - no transaction is active
Mặc dù lỗi, kết quả db cũng được hợp nhất. Và không có sự bắt đầu/cam kết, không có lỗi gì cả.
- Tại sao tôi không thể chạy lệnh bắt đầu/cam kết?
- Hoàn toàn cần thiết để chạy bắt đầu/cam kết hợp nhất một cách an toàn các tệp db? Bài viết nói rằng mục đích bắt đầu/cam kết là để tăng tốc. Sau đó, sự khác biệt giữa việc sử dụng và không sử dụng lệnh bắt đầu/cam kết về mặt tăng tốc là gì?
@prosseek có vẻ như phương thức 'thực thi' của con trỏ không thể thực thi câu lệnh 'cam kết'. Đây không phải là vấn đề lớn vì bạn chỉ có thể sử dụng phương thức 'commit' trên đối tượng connection. – aaronasterling