Найти - Пользователи
Полная версия: вопрос о ZODB
Начало » Базы данных » вопрос о ZODB
1
guranvir
Python 2.6 &Ubuntu 0.10 Maverick
ZODB установлен через PyPI
Решил поэксперементировать с примером из руководства и…. столкнулся с такой ошибкой:
  
No handlers could be found for logger "zc.lockfile"
Traceback (most recent call last):
File "/home/gur/openpypsi/ZODB/ZODBexample.py", line 6, in <module>
storage = FileStorage.FileStorage('drawing.fs')
File "/usr/local/lib/python2.6/dist-packages/ZODB/FileStorage/FileStorage.py", line 126, in __init__
self._lock_file = LockFile(file_name + '.lock')
File "/usr/local/lib/python2.6/dist-packages/zc/lockfile/__init__.py", line 76, in __init__
_lock_file(fp)
File "/usr/local/lib/python2.6/dist-packages/zc/lockfile/__init__.py", line 59, in _lock_file
raise LockError("Couldn't lock %r" % file.name)
LockError: Couldn't lock 'drawing.fs.lock'
А вот если запустить под рутом все нормально читается из хранилища, остается только ошибка:
No handlers could be found for logger "ZODB.FileStorage"
На винде возникает только вторая из вышеприведенных
Но это я так понимаю связано с тем, что ZODBотдает логи о своих действиях и ожидает, что будет функция, их принимающая.
Сам код примера:
from turtle import *

import transaction
from ZODB import DB, FileStorage

storage = FileStorage.FileStorage('drawing.fs')
db = DB(storage)
connection = db.open()
drawing = connection.root()

def switchupdown(x=0, y=0):
pen()['pendown'] and not up() or down()

def redraw(turtle_buffer):
ops = [turtle_buffer.pop() for i in range(turtle_buffer.nr_of_items())]
ops.reverse()
for op in ops:
if op[0] == 'go':
up()
goto(op[1])
if op[3][0]:
down()
goto(op[2])

def clear():
clearscreen()
init()

def quit():
drawing['turtle_buffer'] = getturtle().undobuffer
transaction.commit()
bye()

def init():
onscreenclick(goto,1)
onscreenclick(switchupdown,3)
onkey(quit, 'q')
onkey(clear, 'c')
listen()

if __name__ == "__main__":
if 'turtle_buffer' in drawing:
redraw(drawing['turtle_buffer'])
init()
mainloop()
Взято из ZODB Book v1 documentation:Our First ZODB Application
Я согласен, что пример грязноват: например не закрывается соединение с базой и используются неперсистентные данные, однако взяв пример с персистетным набором данных на Linux получил ту же первую ошибку. Я так понимаю, что программе(точнее учетке, под которой работает программа) нужны дополнительные разрешения.А вот какие?
regall
guranvir
No handlers could be found for logger “ZODB.FileStorage”
Это как раз из-за того, что соединение не закрыли. Нужно делать
db.close()
тогда будет все ок.
guranvir
LockError: Couldn't lock ‘drawing.fs.lock’
Процесс после завершения в общем случае должен убивать lock. Разве что у вас нет прав на удаление этого файла.
guranvir
Большое спасибо regall! Обе проблемы были решены, закрытием соединения с базой. Судя по всему при завершении программы не происходит корректного освобождения ресурсов, при отсутствии принудительного закрытия соединения с базой.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB