使用Python中的SQLAlchemy对三个表之间的多对多关系建模数据库。

3

让我们考虑在Python中使用SQLAlchemy的以下表模型。

class Worker(Base):
    id Column(Integer, primary = True)
    name Column(String, nullable = False)

class Project(Base):
    id Column(Integer, primary = True)
    name Column(String, nullable = False)

class Rating(Base):
    id Column(Integer, primary = True)
    description Column(String, nullable = False)

让我们考虑一些这些表格上的限制。(请不要质疑这个例子的意义,它是我想到的最好的描述我想学习的内容。:-))
1.一个“工人”可能有多个“项目”要处理。 2.一个“项目”可能有多个被分配到其上的“工人”。 3.对于每个元组(工人、项目),您都有一个不同的“评分”。
我理解,我有三个多对多关系。它们是:
1.工人和项目 2.工人和评分 3.评分和项目
我没有问题来定义两个表之间的多对多关系。我只需要添加以下关联表和我的模型之间的关系即可。
worker_project = Table('worker_project', METADATA,
                       Column('worker_id', Integer, ForeignKey('workers.id')),
                       Column('project_id', Integer, ForeignKey('projects.id')),

class Worker(Base):
    # [...]
    papers = relationship('Project',
                          secondary=worker_project,
                          backref='workers')

我失败的地方是无法像上面所描述的那样连接“评分”表。 感谢任何帮助。

1个回答

4
将评分表格设计成如下所示:
  Rating
---------------------
  rating_id (primary key) 
  worker_id (foreign key - worker(worker_id)) 
  project_id (foreign key - project(project_id)) 
  description

如果我理解正确的话。

假设数据库中有一些数据,那么这意味着:worker.rating_id 将为我提供该工人的所有评级集合。project.rating_id 将为我提供参与特定项目的所有工人的评级集合。对吧?给定一个工人和一个项目,我总是需要计算 worker.rating_idproject.rating_id 的交集,以获取特定项目上给定作者的评级,对吧? - Aufwind
1
如果你有workerid和projectid,你只需要使用"SELECT * FROM Rating WHERE workerid = ? AND projectid = ?;",它会给你这个“项目+工作者”组合的评分行(不知道如何将其翻译为SQLAlchemy语法)。我认为你不需要在工作者和评分之间建立多对多的关系。 - Steinthor.palsson
我假设你只想要每个(项目+工人)的一个评级。顺便说一下。 - Steinthor.palsson
这正是我想知道的,非常感谢!我会尝试一下,看看结果如何。 - Aufwind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接