2013-01-24 46 views
9

Tôi đang lưu trữ đường dẫn tệp dưới dạng đường dẫn tương đối trong cơ sở dữ liệu, nhưng sau đó tôi sử dụng thuộc tính lai để biến thành đường dẫn tuyệt đối khi ánh xạ của nó. Khi tôi truy vấn bằng thuộc tính này, nó sẽ phát ra lỗi. Dưới đây là mô hình:Truy vấn thuộc tính lai trong 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 

Khi tôi chạy truy vấn này (nơi ref là một chuỗi unicode):

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

Nó mang lại cho tôi lỗi này:

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 

Trả lời

13

sở hữu lai của bạn phải trở lại một biểu thức sql; của bạn không, nó trả về một chuỗi python thay thế.

Để giải quyết điều đó đối với trường hợp này, đừng làm con đường tham gia trong python nhưng trong một biểu thức SQL thay vì:

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

mà sẽ giải quyết để self._f_path.__radd__(result_of_project_dir_plus_os_path_sep), có thể được sử dụng cả hai trong các truy vấn và như là một giá trị trả lại.

+0

Hoàn hảo. Tôi vẫn còn nhiều thứ để tìm hiểu khi nói đến SQLAlchemy và SQL. Cảm ơn rất nhiều. –

Các vấn đề liên quan