sqlalchemy Base Class引发“在旧样式类上使用属性”错误

时间:2013-02-12 07:09:39

标签: python sqlalchemy

想知道sqlalchemy中的 Base 是否继承自对象。详见下文。

目前正在使用Python3和SQLAlchemy 0.8

在我的项目中,我用(对象)声明了一个新的样式类,我继续使用“Property”来定义我的类中的属性。该课程正常“下面的示例代码”

class LoadFile(object):

    def _set_year(self, value): 
        '''set the year'''    
        value = value[6:10]
        if valid_integer(value) != True:
            raise Exception ("File Name Error: The year value should be a numeral")
        self._year = value
    def _get_year(self):
        '''get the year'''
        return self._year

    year = property(_get_year, _set_year)

随着我的项目不断增长,我已经开始使用SQLAlchemy并运行该类,它抛出了错误

class LoadFile(object):
    __tablename__ = "load_file"
    id = Column(Integer(10), primary_key = True)
    file_name = Column(String(250), nullable = False, unique = True)
    file_path = Column(String(500), nullable = False)
    date_submitted = Column(DateTime, nullable = False)
    submitted_by = Column(String, nullable = False)

    def _set_year(self, value): 
        '''set the year'''    
        value = value[6:10]
        if valid_integer(value) != True:
            raise Exception ("File Name Error: The year value should be a numeral")
        self._year = value
    def _get_year(self):
        '''get the year'''
        return self._year

    year = property(_get_year, _set_year)

它抛出的错误是:

AttributeError: 'LoadFile' object has no attribute '_sa_instance_state'

File "/usr/local/lib/python3.2/dist-packages/SQLAlchemy-0.8.0b2-py3.2.egg/sqlalchemy/orm/session.py", line 1369, in add
raise exc.UnmappedInstanceError(instance)
sqlalchemy.orm.exc.UnmappedInstanceError: Class '__main__.LoadFile' is not mapped

所以我注意到我没有继承“ Base ”所以我把课程改为:

class LoadFile(Base):

有了这个,sqlalchemy工作正常,表格成功创建。但是,我现在注意到我在日食中发出警告

Use of "property" on an old style class"

所以我想知道, Base 是否继承自Object?以为我早些时候读过它确实如此。另外,为什么我现在得到这个“警告”。我知道我可以忽略它,但只是想找出确切的原因,也许是如何纠正它。

感谢。

更新

我开始使用装饰器,如下所示。这样,上面的“警告”就消失了

@property
def year(self):
    '''get the year'''
    return self._year
@year.setter
def year(self, value): 
    '''set the year'''
    if valid_integer(value) != True:
        raise Exception ("File Name Error: The year value should be a numeral")
    self._year = value

这样可以处理警告。但是我仍然不明白为什么前面的方法有警告......而且,我不太确定哪个是使用装饰器或前一个装置的最佳方法。

1 个答案:

答案 0 :(得分:0)

Python 3中不存在旧式类,因此警告是假的。检查Eclipse中的Preferences和Project Properties,也许有对Python 2.x的引用。