首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >灵丹妙药(SqlAlchemy):具有复合主键的3个表之间的关系

灵丹妙药(SqlAlchemy):具有复合主键的3个表之间的关系
EN

Stack Overflow用户
提问于 2009-05-07 16:50:58
回答 1查看 1.8K关注 0票数 1

我有三张桌子:

  • 一个带有(company_id)主键
  • 的公司表一个带有(company_id, url)主键的页面表和一个返回
  • 的外键,一个带有(company_id, attr_key)主键的Attr表和一个返回公司的外键。

F 210

我的问题是如何利用Attr中现有的列,即ManyToOne和url,构建从Attr到页面的Attr关系?

代码语言:javascript
复制
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的主密钥)。

这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-05-14 23:34:12

是的你能做到的。灵丹妙药没有一个内置的方法来实现这一点,但是因为它是SQLAlchemy上的一个薄包装器,所以您可以说服它这样做。因为Elixir没有重用现有列的多对一关系的概念,所以需要使用GenericProperty和SQLAlchemy关系属性,并使用表选项添加外键。下面的代码应该做您想做的事情:

代码语言:javascript
复制
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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/835834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档