我有一个程序作为更大进程的一部分运行,其唯一目的是将sqlite数据库安全地复制到另一个文件夹进行备份。唯一的问题是我的生产运行刚刚停止,因为数据库被其他进程锁定。有没有办法为这个程序指定等待获取锁?如果它能在几秒钟内完成程序的其余部分就可以了。
这是我的代码:
import sqlite3
import shutil
import optparse
import os
import time
import logging
logging.basicConfig(level=logging.INFO, format="[%(levelname)s] - %(message)s")
logging.disable(logging.CRITICAL)
def sqlite3_backup(db_file, backup_dir):
print 'DB is: ', db_file + '\n', 'Backup Dir is: ', backup_dir
if not os.path.isdir(backup_dir):
raise Exception("Backup directory does not exist: {0}".format(backup_dir))
with sqlite3.connect(db_file) as conn:
logging.info('Connected to the database.')
cursor = conn.cursor()
cursor.execute('begin immediate')
shutil.copy(db_file, backup_dir)
logging.info('Closing the database.')
usage = "%prog [options] db-file backup-dir"
description = """\
Backup sqlite3 database to a directory, appending a datestamp on the backup."""
def get_options():
parser = optparse.OptionParser(usage=usage, description=description)
opts, args = parser.parse_args()
if len(args) != 2:
raise parser.error("Incorrect number of parameters")
opts.databasefile, opts.backupdir = args
return opts
if __name__ == '__main__':
opts = get_options()
sqlite3_backup(opts.databasefile, opts.backupdir)
答案 0 :(得分:1)
if __name__ == '__main__':
opts = get_options()
for i in range(90): #give up after 90 seconds
try:
sqlite3_backup(opts.databasefile, opts.backupdir)
except sqlite3.OperationalError as e:
if "locked" in str(e):
time.sleep(1)
else:
raise
else:
sys.stdout.write("OK Backup sucess!")
sys.exit(0)
sys.stderr.write("Unable to aquire database lock...")
sys.exit(1)
有一种方法可以做到这一点......
我还建议使用ORM,因为我认为大多数ORM可以在幕后为您实现此类事情(也许我错了)