質問

3つのテーブルがあります:

  • (company_id)プライマリキーを持つCompanyテーブル
  • (company_id、url)主キー&を持つページテーブル会社に戻る外部キー
  • (company_id、attr_key)プライマリキー&を持つAttrテーブル会社に戻る外部キー。

私の質問は、Attrの既存の列、つまり company_id および url を使用してAttrからPageに戻るManyToOne関係を構築する方法ですか?

from elixir import Entity, has_field, setup_all, ManyToOne, OneToMany, Field, Unicode, using_options
from sqlalchemy.orm import relation

class Company(Entity):
    using_options(tablename='company')
    company_id = Field(Unicode(32), primary_key=True)
    has_field('display_name', Unicode(255))
    pages = OneToMany('Page')

class Page(Entity):
    using_options(tablename='page')
    company = ManyToOne('Company', colname='company_id', primary_key=True)
    url = Field(Unicode(255), primary_key=True)

class Attr(Entity):
    using_options(tablename='attr')
    company = ManyToOne('Company', colname='company_id', primary_key=True)
    attr_key = Field(Unicode(255), primary_key=True)
    url = Field(Unicode(255)) #, ForeignKey('page.url'))
    # page = ManyToOne('Page', colname=["company_id", "url"])
    # page = relation(Page, backref='attrs', foreign_keys=["company_id", "url"], primaryjoin=and_(url==Page.url_part, company_id==Page.company_id))

失敗した試行をコメントアウトしました。

最終的に、Attr.company_idは、PageとCompanyの両方の外部キー(およびAttrの主キー)である必要があります。

これは可能ですか?

役に立ちましたか?

解決

はい、これを行うことができます。 Elixirにはこれを行うための組み込みの方法はありませんが、SQLAlchemyの薄いラッパーであるため、これを行うように説得できます。 Elixirには既存の列を再利用する多対1のリレーションという概念がないため、GenericPropertyをSQLAlchemyリレーションプロパティと共に使用し、テーブルオプションを使用して外部キーを追加する必要があります。次のコードはあなたが望むことをするはずです:

from elixir import Entity, has_field, setup_all, ManyToOne, OneToMany, Field, Unicode, using_options, using_table_options, GenericProperty
from sqlalchemy.orm import relation
from sqlalchemy import ForeignKeyConstraint

class Company(Entity):
    using_options(tablename='company')

    company_id = Field(Unicode(32), primary_key=True)
    display_name = Field(Unicode(255))
    pages = OneToMany('Page')

class Page(Entity):
    using_options(tablename='page')

    company = ManyToOne('Company', colname='company_id', primary_key=True)
    url = Field(Unicode(255), primary_key=True)
    attrs = OneToMany('Attr')

class Attr(Entity):
    using_options(tablename='attr')

    page = ManyToOne('Page', colname=['company_id', 'url'], primary_key=True)
    attr_key = Field(Unicode(255), primary_key=True)

    using_table_options(ForeignKeyConstraint(['company_id'], ['company.company_id']))
    company = GenericProperty(relation(Company))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top