У меня проблемы с ZODB LockError
, но я считаю, что я работаю только с одним процессом на БД.
Моя цель для моего проекта состоит в том, чтобы иметь только две функции, load_project()
и save_project()
, которые позволяют пользователю загружать объект Project
, работать с ним, а затем периодически сохранять его с save_project()
, не имея пользователя взаимодействовать с ZODB напрямую. Вроде как они просто работают над документом и сохраняют на ходу.
Однако я заметил, что последовательно получаю LockError
: я могу загрузить объект, сохранить объект один раз, но затем я получаю LockError
всякий раз, когда пытаюсь сохранить его впоследствии. Очевидно, что я что-то сделал неправильно или не понимаю, как работает ZODB. Как я могу предотвратить это LockError
?
Все другие проблемы LockError в SO, похоже, имеют дело с несколькими процессами. Я взаимодействую с кодом через Блокнот Jupyter, который, как я считаю, является всего лишь одним процессом. Когда я запускаю LockError, я могу перезапустить ядро (запустив тем самым новый процесс), загрузить проект и затем сохранить его снова. Но тогда я не могу сохранить его во второй раз.
Вот код из двух функций, которые я импортирую из моего functions
модуля:
def save_project(project: BIMProject):
"""
Commits the project to the ZODB; including opening and closing the connection
"""
if not hasattr(project, "filename"):
project.filename = input("Enter a filename (without extension):")
if not hasattr(project, "filepath"):
tk_root = Tk()
tk_root.withdraw()
project.filepath = filedialog.askdirectory(title="Please select a directory")
filename = project.filename
full_path = project.filepath + "/" + filename
storage=FileStorage(full_path)
db=ZODB.DB(storage)
connection=db.open()
root=connection.root()
if 'project' in root:
root.update({'project': project})
else:
root['project'] = project # reassign to change
transaction.commit()
connection.close()
def load_project():
"""
Loads a project from a database file
"""
tk_root = Tk()
tk_root.withdraw()
filepath = filedialog.askopenfilename(title="Please select a database file")
storage = FileStorage(filepath)
db = ZODB.DB(storage)
connection = db.open()
root = connection.root()
project = copy.deepcopy(root["project"])
connection.close()
db.close()
return project
Любая помощь будет принята с благодарностью.