gpt4 book ai didi

python - sqlalchemy 通过另一个关系(声明性)

转载 作者:行者123 更新时间:2023-12-01 06:17:11 25 4
gpt4 key购买 nike

有人熟悉 ActiveRecord 的模型“has_many :through”关系吗?我并不是一个真正的 Rails 爱好者,但这基本上就是我想做的事情。

作为一个人为的示例,请考虑项目、程序员和作业:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

from sqlalchemy import Column, ForeignKey
from sqlalchemy.types import Integer, String, Text
from sqlalchemy.orm import relation

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class Assignment(Base):
__tablename__ = 'assignment'
id = Column(Integer, primary_key=True)
description = Column(Text)

programmer_id = Column(Integer, ForeignKey('programmer.id'))
project_id = Column(Integer, ForeignKey('project.id'))

def __init__(self, description=description):
self.description = description

def __repr__(self):
return '<Assignment("%s")>' % self.description

class Programmer(Base):
__tablename__ = 'programmer'
id = Column(Integer, primary_key=True)
name = Column(String(64))

assignments = relation("Assignment", backref='programmer')

def __init__(self, name=name):
self.name = name

def __repr__(self):
return '<Programmer("%s")>' % self.name

class Project(Base):
__tablename__ = 'project'
id = Column(Integer, primary_key=True)
name = Column(String(64))
description = Column(Text)

assignments = relation("Assignment", backref='project')

def __init__(self, name=name, description=description):
self.name = name
self.description = description

def __repr__(self):
return '<Project("%s", "%s...")>' % (self.name, self.description[:10])

engine = create_engine('sqlite://')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

项目有很多任务。

程序员有很多任务。 (轻描淡写?)

但至少在我的办公室,程序员也有很多项目 - 我希望通过分配给程序员的作业来推断这种关系。

我希望程序员模型有一个属性“projects”,它将返回通过分配模型与程序员关联的项目列表。

me = session.query(Programmer).filter_by(name='clay').one()
projects = session.query(Project).\
join(Project.assignments).\
join(Assignment.programmer).\
filter(Programmer.id==me.id).all()

如何使用 sqlalchemy 声明性语法清楚、简单地描述这种关系?

谢谢!

最佳答案

我认为有两种方法:

  1. 使用 secondary='assignment' 定义关系 Programmer.projects

  2. 我将 Assignment.project 定义为关系,将 Programmer.projects 定义为 association_proxy('assignments', 'project') (也许您还想定义一个创建者)。请参阅Simplifying Association Object Relationships章节了解更多信息。

关于python - sqlalchemy 通过另一个关系(声明性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2630146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com