2013-01-24 23 views
9

में एक संकर संपत्ति की क्वेरी करना मैं डेटाबेस में सापेक्ष पथ के रूप में फ़ाइल पथ संग्रहीत कर रहा हूं, लेकिन फिर मैं मैप किए जाने पर एक पूर्ण पथ में बदलने के लिए हाइब्रिड गुणों का उपयोग कर रहा हूं। जब मैं इस संपत्ति का उपयोग कर पूछता हूं तो यह एक त्रुटि फेंकता है। यहाँ मॉडल है: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 

जब मैं इस क्वेरी (जहां रेफरी एक यूनिकोड स्ट्रिंग) चलाएँ:

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

यह मुझे इस त्रुटि देता है:

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 

उत्तर

13

आपका संकर संपत्ति लौटना चाहिए एक एसक्यूएल अभिव्यक्ति; तुम्हारा नहीं है, यह इसके बजाय एक अजगर स्ट्रिंग देता है।

इस मामले को हल करने के लिए है कि, पथ नहीं करते अजगर में लेकिन बजाय एक एसक्यूएल अभिव्यक्ति में शामिल होने:

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

जो self._f_path.__radd__(result_of_project_dir_plus_os_path_sep) हो जाएगी, जो दोनों प्रश्नों में और एक के रूप में इस्तेमाल किया जा सकता प्रतिलाभ की मात्रा।

+0

बिल्कुल सही। जब मुझे स्क्लेक्लेमी और एसक्यूएल की बात आती है तो मुझे अभी भी बहुत कुछ सीखना पड़ता है। बहुत बहुत धन्यवाद। –