将两列设置为外键引用SQLAlchemy中的两个主键[duplicate]

问题描述 投票:0回答:1

我正在烧瓶中使用SQLALchemy。而且我对如何将两列设置为外键引用两个主键感到困惑。

class Feature(db.Model):
    __tablename__ = 'feature'
    id = db.Column(Integer, primary_key=True)
    sample_id = db.Column(Integer, ForeignKey('sample.id'), primary_key=True)


class Move(db.Model):
    __tablename__ = 'move'
    id = db.Column(Integer, primary_key=True, autoincrement=True)
    feature_id = db.Column(Integer, ForeignKey(Feature.id), nullable=False)
    sample_id = db.Column(Integer, ForeignKey(Feature.sample_id), nullable=False)
    __table_args__ = (
        db.UniqueConstraint('feature_id', 'sample_id'),
    )

我尝试了几种配置,但是当我尝试插入某些内容时:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) foreign key mismatch - "move" referencing "feature"

事实上,create语句是错误的:

CREATE TABLE move (
    id INTEGER NOT NULL, 
    feature_id INTEGER NOT NULL, 
    sample_id INTEGER NOT NULL,
    PRIMARY KEY (id), 
    UNIQUE (feature_id, sample_id), 
    FOREIGN KEY(feature_id) REFERENCES feature (id), 
    FOREIGN KEY(sample_id) REFERENCES feature (sample_id)
)

最后一行应该是:

FOREIGN KEY(feature_id, sample_id) REFERENCES feature (id, sample_id)

python sqlite sqlalchemy flask-sqlalchemy
1个回答
0
投票

最后,我找到了解决方案here

工作代码为:

class Move(db.Model):
    __tablename__ = 'move'
    id = db.Column(Integer, primary_key=True, autoincrement=True)
    feature_id = db.Column(Integer)
    sample_id = db.Column(Integer)
    __table_args__ = (ForeignKeyConstraint([feature_id, sample_id],
                                           [Feature.id, Feature.sample_id]), {})
© www.soinside.com 2019 - 2024. All rights reserved.