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 にしようとしていますが、その変数はローカルで上書きされただけです。2 つの順序を入れ替えると、この問題が解決します。

于 2013-08-14T21:20:38.683 に答える