'RelationshipProperty'对象在sqlalchemy中没有属性'c'错误

时间:2013-03-27 10:06:03

标签: python orm sqlalchemy flask-sqlalchemy

我在为旧版MSSQL数据库实现SQLalchemy方面遇到了很多麻烦。它是一个很大的现有数据库,所以我想使用sqlautocode为我生成文件,因为使用自动加载来反映数据库需要太长时间。

第一个问题是sqlautocode似乎不再适用于SQLalchemy 0.8。我确实仍然有早期版本的现有输出,所以我想我会使用它,只是为了测试。

现在sqlautocode输出'classical mapping',这不是一个真正的问题,但每当我尝试使用外键时,'RelationshipProperty' object has no attribute 'c'就会显示出来。 SQLalchemy库内部的某个错误。

接下来,我尝试跳过sqlautocode并自己编写类和关系,然后通过this code获取SQLalchemy 0.8。我使用了两个示例表,我得到了完全相同的错误。然后我评论了大多数列,所有关系和I -STILL-得到错误。

以下是我的代码:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, ForeignKey
from sqlalchemy.orm import relationship, backref
from sqlalchemy.dialects.mssql import *

Base = declarative_base()


class PeopleMemberhip(Base):
    __tablename__ = 'people_memberships'

    ppl_mshp_id = Column(VARCHAR(length=36), primary_key=True, nullable=False)
    ppl_mshp_startdate = Column(DATETIME())
    ppl_mshp_enddate = Column(DATETIME())
    # ppl_mshp_pmsd_id = Column(VARCHAR(length=36), ForeignKey('paymentschedules.pmsd_id'))

    # paymentschedule = relationship("PaymentSchedule", backref=backref('people_memberships'))

    def __repr__(self):
        return "<people_membership('%s','%s')>" % (self.ppl_mshp_id, self.ppl_mshp_startdate)


class PaymentSchedule(Base):
    __tablename__ = 'paymentschedules'

    pmsd_id = Column(VARCHAR(length=36), primary_key=True, nullable=False)
    pmsd_name = Column(NVARCHAR(length=60))
    pmsd_startdate = Column(DATETIME())
    pmsd_enddate = Column(DATETIME())

    # paymentschedule = relationship("PaymentSchedule", backref=backref('people_memberships'))

    def __repr__(self):
        return "<paymentschedule('%s','%s')>" % (self.pmsd_id, self.pmsd_name)

结果错误:

Traceback (most recent call last):
  File "C:\Program Files (x86)\JetBrains\PyCharm 2.7\helpers\pydev\pydevd.py", line 1472, in <module>
    debugger.run(setup['file'], None, None)
  File "C:\Program Files (x86)\JetBrains\PyCharm 2.7\helpers\pydev\pydevd.py", line 1116, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "C:/Users/erik/workspace/flasktest/test.py", line 16, in <module>
    contract = db.session.query(PeopleMemberhip).filter_by(ppl_mshp_id='98ABD7E9-4CFF-4F7B-8537-8E46FD5C79D5').one()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\scoping.py", line 149, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\session.py", line 1105, in query
    return self._query_cls(entities, self, **kwargs)
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\query.py", line 115, in __init__
    self._set_entities(entities)
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\query.py", line 124, in _set_entities
    self._set_entity_selectables(self._entities)
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\query.py", line 157, in _set_entity_selectables
    ent.setup_entity(*d[entity])
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\query.py", line 2744, in setup_entity
    self._with_polymorphic = ext_info.with_polymorphic_mappers
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\util\langhelpers.py", line 582, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\mapper.py", line 1425, in _with_polymorphic_mappers
    configure_mappers()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\mapper.py", line 2106, in configure_mappers
    mapper._post_configure_properties()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\mapper.py", line 1242, in _post_configure_properties
    prop.init()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\interfaces.py", line 231, in init
    self.do_init()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\properties.py", line 1028, in do_init
    self._setup_join_conditions()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\properties.py", line 1102, in _setup_join_conditions
    can_be_synced_fn=self._columns_are_mapped
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\relationships.py", line 115, in __init__
    self._annotate_fks()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\relationships.py", line 311, in _annotate_fks
    self._annotate_present_fks()
  File "C:\Users\erik\workspace\flasktest\lib\site-packages\sqlalchemy\orm\relationships.py", line 331, in _annotate_present_fks
    secondarycols = util.column_set(self.secondary.c)
AttributeError: 'RelationshipProperty' object has no attribute 'c'

我真的很茫然,对此错误的任何帮助表示赞赏,但如果有人可以建议一种可以使SQLalchemy与我们的旧MSSQL数据库一起工作的不同方法,那么它也是一种解决方案。

正如我所说,sqlautocode似乎不再起作用,但也许我使用它的方式不对,或者可能有一个我不知道的替代工具。

埃里克

1 个答案:

答案 0 :(得分:2)

好的,伙计们,我自己想出来了。

我有几个我搞乱的文件,其中有表定义(来自sqlautocode的输出)。一个被称为'database.py'另一个'model.py',最后一个被称为'ORM.py'。

我有一个导入'model.py'的test.py文件。 Model.py是我编写表定义的文件。但是 - test.py页面也从Flask(from app import app, db)内部导入数据库,并在Flask应用程序的__init__()函数中导入数据库,Flask仍在加载'ORM.py'。

所以有些对象来自ORM.py,这是一个由sqlautocode生成的旧文件,而不是来自我正在尝试的model.py。

重命名ORM.py给了我一个线索。我在Python中编写了一个非常简单的脚本,遍历MSSQL表和列,并为我生成了一个model.py.我现在专门加载那个model.py文件,整个过程都有效!

很抱歉,如果有人花时间在这上面。希望它可以帮助有人谷歌解决同样的问题。

埃里克