【问题标题】:Sqlalchemy and many to many relationship linking two tablesSqlalchemy 和多对多关系链接两个表
【发布时间】:2021-02-12 07:08:40
【问题描述】:

我在使用 Sqlalchemy 创建 Orders 和 ProductOrders 表之间的链接时遇到问题。我需要链接 order_id,它同时存在于 Orders 表和 ProductOrders 表中,以便从商店查询订单并获取产品数据。我正在使用 BigCommerce API,因此 order_id 仅对每个特定商店都是唯一的,而不像 Shopify API 那样在全球范围内是唯一的。

order_id 是我希望创建的链接,但它仅对 Store 表中的每个 store.id 都是唯一的,因此我无法进行简单的连接,因为 order_id 本身并不是唯一的。我是使用 Store 表来链接这种多对多关系,还是需要使用已经将 store_id 和 user_id 链接在一起的 StoreUser 表?我感到很困惑。任何帮助将不胜感激。

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)

【问题讨论】:

    标签: python sqlalchemy bigcommerce


    【解决方案1】:

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

    此答案显示 sqlalchemy 中的多列主键:https://stackoverflow.com/a/9036128/210101

    这个显示加入多个列:https://stackoverflow.com/a/51164913/210101

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-15
      • 2021-06-26
      • 2010-12-25
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多