Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 此关系是否需要多个关联表?_Python_Sqlalchemy_Associations_Relationship - Fatal编程技术网

Python 此关系是否需要多个关联表?

Python 此关系是否需要多个关联表?,python,sqlalchemy,associations,relationship,Python,Sqlalchemy,Associations,Relationship,我正试图找到一种最好的方法来构建一种将许多常量映射到许多项的关系 我最初的关系,一个项目有一个常数,看起来像这样 class Constant(Base): __tablename__ = "Constant" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(64), nullable=False) class Item(Base): __tablen

我正试图找到一种最好的方法来构建一种将许多常量映射到许多项的关系

我最初的关系,一个项目有一个常数,看起来像这样

class Constant(Base):
    __tablename__ = "Constant"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)

class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    constantId = Column(Integer, ForeignKey("Constant.id"))
    constant = relationship("Constant")
  query(Item). join(item_to_constant_assoc.itemId==Item.itemId). join(item_to_constant_assoc.contantId==Constant.constantId
然而,我真的需要我的项目有一个以上的常数,像这样的东西

class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    constant1Id = Column(Integer, ForeignKey("Constant.id"))
    constant1 = relationship("Constant")
    constant2Id = Column(Integer, ForeignKey("Constant.id"))
    constant2 = relationship("Constant")
我的第一次尝试是使用关联表

item_to_constant_assoc = Table("itemToConstantAssoc", Base.metadata, Column("constantId", Integer, ForeignKey("Constant.id"), Column("itemId", Integer, ForeignKey("Item.id")))
相应地更新项目类时:

Class Item(Base):
__tablename__ = "Item"
id = Column(Integer, primary_key=True, autoincrement=True)
constant1 = relationship("Constant", secondary=item_to_constant_assoc, uselist=False)
constant2 = relationship("Constant", secondary=item_to_constant_assoc, uselist=False)
这失败了(在查看创建的MySQL表时可以理解),因为Item.constant1和Item.constant2引用了关联表中的相同条目

我的下一步是为第二个常量添加另一个关联表,但我不得不怀疑我是否选错了树,因为我似乎为一个相对简单的映射创建了大量的表。我已经看过文件了。它是详细和实质性的(感谢迈克尔·拜耳!),我可能只是忽略了一个部分。有谁能给我一些关于这个问题的建议,或者我应该在文档中寻找什么

谢谢!
菲尔看不见树林,看不见树木。这可以通过使用关系上的
primaryjoin
参数轻松实现

class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    constant1Id = Column(Integer, ForeignKey("Constant.id"))
    constant1 = relationship("Constant", primaryjoin="Constant.id==Item.constant1Id")
    constant2Id = Column(Integer, ForeignKey("Constant.id"))
    constant2 = relationship("Constant", primaryjoin="Constant.id==Item.constant2Id")

看不见树林,看不见树木。这可以通过使用关系上的
primaryjoin
参数轻松实现

class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    constant1Id = Column(Integer, ForeignKey("Constant.id"))
    constant1 = relationship("Constant", primaryjoin="Constant.id==Item.constant1Id")
    constant2Id = Column(Integer, ForeignKey("Constant.id"))
    constant2 = relationship("Constant", primaryjoin="Constant.id==Item.constant2Id")

多对多关联已经允许每个项具有无限数量的常量。您不需要更多的东西作为两个基表

class Constant(Base):
    __tablename__ = "Constant"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)

class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)    

item_to_constant_assoc = Table("itemToConstantAssoc", Base.metadata, Column("constantId", Integer, ForeignKey("Constant.id"), Column("itemId", Integer, ForeignKey("Item.id")))
在这一点上,每个项目都有无限数量的常量。当您想要一个特定的常量时,您必须通过常量表中的name属性查询该常量。您的关联表只是一个键对列表:(itemID,constantId)

一个项目的所有常量集是一个三表联接,用于联接与给定项目的匹配常量行联接的所有关联行

常数的所有项集是一个三表联接,用于所有关联行,用于与给定常数的匹配项行联接

需要通过联接检索项的特定常量。您将其视为给定项的所有常量集,其中项和常量名称都给定。即使只检索到一行,SQL也包含一个联接

我认为,将常量与所有相关项相关联或将项与所有相关常量相关联的一般查询将如下所示

class Constant(Base):
    __tablename__ = "Constant"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)

class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    constantId = Column(Integer, ForeignKey("Constant.id"))
    constant = relationship("Constant")
  query(Item). join(item_to_constant_assoc.itemId==Item.itemId). join(item_to_constant_assoc.contantId==Constant.constantId

多对多关联已经允许每个项具有无限数量的常量。您不需要更多的东西作为两个基表

class Constant(Base):
    __tablename__ = "Constant"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)

class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)    

item_to_constant_assoc = Table("itemToConstantAssoc", Base.metadata, Column("constantId", Integer, ForeignKey("Constant.id"), Column("itemId", Integer, ForeignKey("Item.id")))
在这一点上,每个项目都有无限数量的常量。当您想要一个特定的常量时,您必须通过常量表中的name属性查询该常量。您的关联表只是一个键对列表:(itemID,constantId)

一个项目的所有常量集是一个三表联接,用于联接与给定项目的匹配常量行联接的所有关联行

常数的所有项集是一个三表联接,用于所有关联行,用于与给定常数的匹配项行联接

需要通过联接检索项的特定常量。您将其视为给定项的所有常量集,其中项和常量名称都给定。即使只检索到一行,SQL也包含一个联接

我认为,将常量与所有相关项相关联或将项与所有相关常量相关联的一般查询将如下所示

class Constant(Base):
    __tablename__ = "Constant"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)

class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    constantId = Column(Integer, ForeignKey("Constant.id"))
    constant = relationship("Constant")
  query(Item). join(item_to_constant_assoc.itemId==Item.itemId). join(item_to_constant_assoc.contantId==Constant.constantId

对你的问题的描述过于抽象。请更清楚地解释你要解决的问题,这样我们才能给出一个有意义的答案。@macguy这可能比你想象的要少一些我要解决的实际问题的抽象性。我有一个视频编辑领域的常数表(例如,名为“FPS23976”的常数定义了23.976 fps的帧速率)。项目表定义了一个记录设备。它有一个捕获速率和一个回放速率,我想引用常量表。如果我把问题说错了,我道歉。这不是我的专长领域。我的问题归结为:“多个关联表是构建这些关系的最佳方式吗?”@Philbolt:请发布澄清,作为问题的更新。没有评论。但一流的更新,使问题是一个,综合的整体。没有一堆有问题的想法加上评论。相机和帧率是相当具体的,远比项目和常量更具体@这是盖伊的观点。谢谢你的意见。对你的问题的描述过于抽象。请更清楚地解释你要解决的问题,这样我们才能给出一个有意义的答案。@macguy这可能比你想象的要少一些我要解决的实际问题的抽象性。我有一个视频编辑领域的常数表(例如,名为“FPS23976”的常数定义了23.976 fps的帧速率)。项目表定义了一个记录设备。它有一个捕获速率和一个回放速率,我想引用常量表。如果我把问题说错了,我道歉。这不是我的专长领域。我的问题归结为:“多个关联表是构建这些关系的最佳方式吗?”@Philbolt:请发布澄清,作为问题的更新。没有评论。但一流的更新,使问题是一个,综合的整体。没有一堆有问题的想法加上评论。相机和帧率是相当具体的,远比项目和常量更具体@这是盖伊的观点。谢谢你的意见。谢谢史蒂文。这确实让我更清楚了关联表的作用。谢谢史蒂文。这确实使关联表的作用对我来说更清楚了。