我正在烧瓶中使用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)
最后,我找到了解决方案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]), {})