Relations on composite keys using sqlalchemy

核能气质少年 提交于 2019-11-26 10:21:52

问题


I have this simple model of Author - Books and can\'t find a way to make firstName and lastName a composite key and use it in relation. Any ideas?

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\'))            

回答1:


The problem is that you have defined each of the dependent columns as foreign keys separately, when that's not really what you intend, you of course want a composite foreign key. Sqlalchemy is responding to this by saying (in a not very clear way), that it cannot guess which foreign key to use (firstName or lastName).

The solution, declaring a composite foreign key, is a tad clunky in declarative, but still fairly obvious:

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]),
                      {})

The important thing here is that the ForeignKey definitions are gone from the individual columns, and a ForeignKeyConstraint is added to a __table_args__ class variable. With this, the relationship defined on Author.books works just right.



来源:https://stackoverflow.com/questions/7504753/relations-on-composite-keys-using-sqlalchemy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!