Sqlalchemy 和链接两个表的多对多关系

Sqlalchemy and many to many relationship linking two tables

我在使用 Sqlalchemy 创建订单和 ProductOrders table 之间的 link 时遇到问题。我需要 link order_id,它存在于订单 table 和 ProductOrders table 中,以便从商店查询订单并获取产品数据。我正在与 BigCommerce API 合作,因此 order_id 仅对每个特定商店唯一,而不像 Shopify API.

那样在全球范围内唯一

order_id 是我想要创建的 link,但它对于商店中的每个 store.id 都是唯一的 table,所以我不能做一个简单的join 因为 order_id 本身不是唯一的。我是使用 Store table 来 link 这种多对多关系,还是我需要使用已经 linking store_id 的 StoreUser table和 user_id 在一起?我感到很困惑。任何帮助将不胜感激。

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    bc_id = db.Column(db.Integer, nullable=False)
    email = db.Column(db.String(120), nullable=False)

    storeusers = relationship("StoreUser", backref="user")

class StoreUser(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    store_id = db.Column(db.Integer, db.ForeignKey('store.id'), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    admin = db.Column(db.Boolean, nullable=False, default=False)

class Store(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    store_hash = db.Column(db.String(16), nullable=False, unique=True)
    access_token = db.Column(db.String(128), nullable=False)
    scope = db.Column(db.Text(), nullable=False)

    admin_storeuser_id = relationship("StoreUser", 
                            primaryjoin="and_(StoreUser.store_id==Store.id, StoreUser.admin==True)")
storeusers = relationship("StoreUser", backref="store")

store_orders_id = relationship("Orders",
                            primaryjoin="(Orders.store_id==Store.id)")
store_orders = relationship("Orders", backref="store", cascade="all, delete")

store_product_orders_id = relationship("ProductOrders",
                            primaryjoin="(ProductOrders.store_id==Store.id)")
store_product_orders = relationship("ProductOrders", backref="store", cascade="all, delete")

class Orders(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    store_id = db.Column(db.Integer, db.ForeignKey('store.id'), nullable=False)
    order_id = db.Column(db.Integer,nullable=False)
    date_created = db.Column(db.DateTime, nullable=False)

class ProductOrders(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    store_id = db.Column(db.Integer, db.ForeignKey('store.id'), nullable=False)
    order_id = db.Column(db.Integer, nullable=False)
    product_id = db.Column(db.Integer, nullable=False)
    base_price = db.Column(db.Float, nullable=False)

我认为你需要一个多列主键,所以唯一约束是 order_id+store_id

这个答案显示了 sqlalchemy 中的多列主键:

这一个显示了多列的连接: