0

使用 PGModeler,我们创建了一个模式,然后导出了一些适当的 SQL 代码。SQL 命令能够在我们的 Postgres 数据库中填充适当的表和行。

从这里开始,我们想创建声明性 Sqlalchemy 模型,因此使用 Sqlautocode。我们在终端运行它:

sqlautocode postgresql+psycopg2://username:password@host/db_name -o models.py -d

它按预期生成了我们的表格和相应的模型。到目前为止,零错误。

然后,在使用 ipython 时,我从 models.py 中导入了所有内容,并简单地尝试创建一个在那里定义的类的实例。突然,我得到这个错误:

AttributeError: 'RelationshipProperty' object has no attribute 'c'

这让我困惑了一段时间。讨论此问题的其他 SO 线程的解决方案与我的问题相去甚远(通常与 sqlautocode 未使用的特定框架或语法有关)。

找到原因后,我决定记录手头的问题。见下文。

4

1 回答 1

1

我们的问题仅仅是由于在运行 sqlautocode 时给我们的变量命名错误。具体来说,错误的命名发生在任何具有自身外键的模型上。

这是一个例子:

#Note that all \"relationship\"s below are now \"relation\"
#it is labeled relationship here because I was playing around...
service_catalog = Table(u'service_catalog', metadata,
    Column(u'id', BIGINT(), nullable=False),
    Column(u'uuid', UUID(), primary_key=True, nullable=False),
    Column(u'organization_id', INTEGER(), ForeignKey('organization.id')),
    Column(u'type', TEXT()),
    Column(u'name', TEXT()),
    Column(u'parent_service_id', BIGINT(), ForeignKey('service_catalog.id')),
)

#Later on...

class ServiceCatalog(DeclarativeBase):
    __table__ = service_catalog


    #relation definitions
    organization = relationship('Organization', primaryjoin='ServiceCatalog.organization_id==Organization.id')
    activities = relationship('Activity', primaryjoin='ServiceCatalog.id==ActivityService.service_id', secondary=activity_service, secondaryjoin='ActivityService.activity_id==Activity.id')
    service_catalog = relationship('ServiceCatalog', primaryjoin='ServiceCatalog.parent_service_id==ServiceCatalog.id')
    organizations = relationship('Organization', primaryjoin='ServiceCatalog.id==ServiceCatalog.parent_service_id', secondary=service_catalog, secondaryjoin='ServiceCatalog.organization_id==Organization.id')

在 ServiceCatalog.organizations 中,它希望辅助表为 service_catalog,但该变量只是在本地被覆盖。切换两者的顺序将解决此问题。

于 2013-08-14T21:20:38.683 回答