如何使用SQLAlchemy Core定义一对一和多对多关系

时间:2018-02-15 05:02:42

标签: sqlalchemy

我搜索了文档,但没有找到任何有用的内容。请指导我正确的方向。

1 个答案:

答案 0 :(得分:1)

一对一

将一个表的ID用作另一个表的外键和主键。

来自overiq

的示例
employees = Table('employees', metadata,
    Column('employee_id', Integer(), primary_key=True),
    Column('first_name', String(200), nullable=False),
    Column('last_name', String(200), nullable=False),
    Column('dob', DateTime(), nullable=False),
    Column('designation', String(200), nullable=False),
)

employee_details = Table('employee_details', metadata,
    Column('employee_id', ForeignKey('employees.employee_id'), primary_key=True, ),
    Column('ssn', String(200), nullable=False),
    Column('salary', String(200), nullable=False),
    Column('blood_group', String(200), nullable=False),
    Column('residential_address', String(200), nullable=False),    
)

多对一

来自SQL Alchemy's official docs

在SQLAlchemy和DDL中,可以将外键约束定义为table子句中的其他属性,或者对于单列外键,可以选择在单个列的定义中指定外键约束。单列外键更为常见,并且在列级别通过构造ForeignKey对象作为Column对象的参数来指定:

user_preference = Table('user_preference', metadata,
    Column('pref_id', Integer, primary_key=True),
    Column('user_id', Integer, ForeignKey("user.user_id"), nullable=False),
    Column('pref_name', String(40), nullable=False),
    Column('pref_value', String(100))
)

多对多

使用两个外键创建第三个表,这些外键引用要在其之间创建关系的表

来自overiq

的示例
posts = Table('posts', metadata,
    Column('id', Integer(), primary_key=True),
    Column('post_title', String(200), nullable=False),
    Column('post_slug', String(200),  nullable=False),
    Column('content', Text(),  nullable=False),    
)

tags = Table('tags', metadata,
    Column('id', Integer(), primary_key=True),
    Column('tag', String(200), nullable=False),
    Column('tag_slug', String(200),  nullable=False),    
)

post_tags = Table('post_tags', metadata,
    Column('post_id', ForeignKey('posts.id')),
    Column('tag_id', ForeignKey('tags.id'))
)