使用sqlalchemy

时间:2016-02-03 15:03:16

标签: python sqlalchemy flask-sqlalchemy

有两个表格,我们称之为Source1Source2,它们都有通常的id和其他不相关的列。然后有ProductSource1Source2Product都有外键,两个外键组成Product的主键(换句话说,就是一个 - - Source1Source2MultiProduct的笛卡尔积之间的关系。然后是另一个表Source1,同时拥有Source2 class Source1(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) # ... class Source2(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) # ... class Product(db.Model): source1_id = db.Column(db.Integer, db.ForeignKey('Source1.id'), primary_key=True) source2_id = db.Column(db.Integer, db.ForeignKey('Source2.id'), primary_key=True) multis = db.relationship('MultiProduct', ...) # 1) what goes here? # ... class MultiProduct(db.Model): source1_id = db.Column(db.Integer, db.ForeignKey('Source1.id'), primary_key=True) source2_id = db.Column(db.Integer, db.ForeignKey('Source2.id'), primary_key=True) extra_id = db.Column(db.Integer, primary_key=True) product = db.relationship('Product', ...) # 2) what goes here? 的外键;它的主键是外键和第三个字段的组合。在flask-sqlalchemy的声明性语言中,到目前为止的模式如下所示:

Product

这实质上导致MultiProductProduct处于一对多的关系中,这是我正在努力描述的关系 - 我希望MultiProduct拥有MultiProduct个对象列表和Product multis = db.relationship("MultiProduct", backref='product', uselist=True, primaryjoin="and_(Product.source1_id==MultiProduct.source1_id," "Product.source2_id==MultiProduct.source2_id)", foreign_keys=[source1_id, source2_id]) 个对象 - 标有“什么在这里”的行对我来说不是很清楚。关于如何执行此操作以及如何简化数据库架构的建议均值得赞赏。

我的尝试一直是

__table_args__

有或没有 __table_args__ = ( db.ForeignKeyConstraint( ['source1_id', 'source2_id'], ['MultiProduct.source1_id', 'MultiProduct.source2_id'], ), )

Product

MultiProductProduct(multis=[MultiProduct(...)])中的任意一个/两个中(具有正确的相应表名)。在执行MultiProduct时,我得到一个例外,说source1_id的{​​{1}}为空,违反约束,即“子”MultiProduct无法从父级获取ID 。

对此进行建模的正确方法是什么?我的数据库架构从一开始就是次优的吗?

0 个答案:

没有答案