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 中的多列主键:
这一个显示了多列的连接:
我在使用 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 中的多列主键:
这一个显示了多列的连接: