繁体   English   中英

使用 sqlalchemy 的复合键关系

[英]Relations on composite keys using sqlalchemy

我有这个简单的 Author - Books 模型,但找不到使 firstName 和 lastName 成为复合键并在相关情况下使用它的方法。 有任何想法吗?

from sqlalchemy import create_engine, ForeignKey, Column, String, Integer
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
engine = create_engine('mssql://user:pass@library')
engine.echo = True
session = sessionmaker(engine)()

class Author(Base):
    __tablename__ = 'authors'
    firstName = Column(String(20), primary_key=True)
    lastName = Column(String(20), primary_key=True)
    books = relationship('Book', backref='author')

class Book(Base):
    __tablename__ = 'books'
    title = Column(String(20), primary_key=True)
    author_firstName = Column(String(20), ForeignKey('authors.firstName'))
    author_lastName = Column(String(20), ForeignKey('authors.lastName'))            

问题是您已将每个依赖列分别定义为外键,当这不是您真正想要的时,您当然需要一个复合外键。 Sqlalchemy 对此回应说(以不太清楚的方式),它无法猜测使用哪个外键( firstNamelastName )。

声明复合外键的解决方案在声明中有点笨拙,但仍然相当明显:

class Book(Base):
    __tablename__ = 'books'
    title = Column(String(20), primary_key=True)
    author_firstName = Column(String(20))
    author_lastName = Column(String(20))
    __table_args__ = (ForeignKeyConstraint([author_firstName, author_lastName],
                                           [Author.firstName, Author.lastName]),
                      {})

这里重要的是ForeignKey定义从各个列中消失了,并且ForeignKeyConstraint添加到了__table_args__类变量中。 这样, Author.books定义的relationship就可以Author.books工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM