我在为旧版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似乎不再起作用,但也许我使用它的方式不对,或者可能有一个我不知道的替代工具。
埃里克
答案 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文件,整个过程都有效!
很抱歉,如果有人花时间在这上面。希望它可以帮助有人谷歌解决同样的问题。
埃里克