문제

나는 3 개의 테이블 :

  • 회사 테이블 (company_id) 기본 키
  • 페이지 테이블 (company_id, url) 기본 키 및 회사로 돌아가는 외국 키
  • att 테이블 (company_id, attr_key) 기본 키 및 회사로 돌아가는 외국 키.

내 질문은 attr의 기존 열을 사용하여 att company_id 그리고 url?

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는 페이지와 회사 (attr의 기본 키)에 대한 외국인이어야합니다.

이게 가능해?

도움이 되었습니까?

해결책

예, 당신은 이것을 할 수 있습니다. Elixir는이 작업을 수행 할 수있는 내장이 없지만 Sqlalchemy의 얇은 래퍼이기 때문에이를 설득 할 수 있습니다. Elixir는 기존 열을 재사용하는 다중 관계의 개념이 없기 때문에 SQLALCHEMY 관계 속성과 함께 GenericProperty를 사용하고 테이블 옵션을 사용하여 외래 키를 추가해야합니다. 다음 코드는 원하는 것을 수행해야합니다.

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