2013-01-24 23 views
9

Przechowuję ścieżki plików w ścieżce względnej w bazie danych, ale używam właściwości hybrydowych, aby zamieniać się w ścieżkę bezwzględną, gdy jest ona odwzorowana. Kiedy wysyłam zapytanie o użycie tej właściwości, generuje błąd. Oto model:Wywoływanie informacji o właściwościach hybrydowych w SQLAlchemy

class File(Base): 
    __tablename__ = 'files' 
    ... 

    _f_path = Column(Unicode(30)) 

    ... 

    @hybrid_property 
    def f_path(self): 
     env = shelve.open('environment') 
     return os.path.join(env['project_dir'], self._f_path) 

    @f_path.setter 
    def f_path(self, _f_path): 
     self._f_path = _f_path 

Kiedy uruchomić tej kwerendy (gdzie ref jest ciągiem znaków Unicode):

session.query(File).filter_by(f_path=ref).first() 

To daje mi ten błąd:

File "/Users/Ben/Dropbox/Giraffe/giraffe_server/giraffe/file_handlers/maya.py", line 135, in process_file 
    rf = session.query(File).filter_by(f_path=str(ref)).first() 
    File "build/bdist.macosx-10.7-intel/egg/sqlalchemy/orm/query.py", line 1211, in filter_by 
    for key, value in kwargs.iteritems()] 
    File "build/bdist.macosx-10.7-intel/egg/sqlalchemy/orm/util.py", line 597, in _entity_descriptor 
    return getattr(entity, key) 
    File "build/bdist.macosx-10.7-intel/egg/sqlalchemy/ext/hybrid.py", line 681, in __get__ 
    return self.expr(owner) 
    File "/Users/Ben/Dropbox/Giraffe/giraffe_server/giraffe/model.py", line 133, in f_path 
    print "\n\n\n[model.py:[email protected]_path hybrid_property] returning: ", os.path.join(env['project_dir'], self._f_path) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 66, in join 
    if b.startswith('/'): 
    File "build/bdist.macosx-10.7-intel/egg/sqlalchemy/sql/expression.py", line 3426, in __nonzero__ 
    raise TypeError("Boolean value of this clause is not defined") 
TypeError: Boolean value of this clause is not defined 

Odpowiedz

13

Twoja nieruchomość hybrydowy musi powrócić wyrażenie sql; twoje nie, zwraca zamiast tego ciąg pythona.

Aby rozwiązać, że w tym przypadku, nie rób ścieżkę dołączyć w Pythonie, ale w wyrażeniu SQL Zamiast:

return env['project_dir'] + os.path.sep + self._f_path 

który będzie rozwiązać do self._f_path.__radd__(result_of_project_dir_plus_os_path_sep), które mogą być wykorzystywane zarówno w zapytaniach i jako zwracana wartość.

+0

Idealny. Wciąż mam dużo więcej do nauczenia się, jeśli chodzi o SQLAlchemy i SQL. Dziękuję bardzo. –

Powiązane problemy