当前位置: 首页 > 面试题库 >

使用SqlAlchemy关联属性过滤association_proxy

袁山
2023-03-14
问题内容

我有一个使用SA的 association_proxy 建模 的多对多
(开发人员和项目)关系。集合(每个项目的开发人员和每个开发人员的项目)工作正常,但我需要过滤关联本身的属性(状态)。像这样的东西(不起作用): __

activeDevelopers = s.query(Developer).filter_by(Developer.developerProjects.status == 'active').all()

我想念什么?这是完整的测试代码

import logging
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import relation, mapper, sessionmaker
from sqlalchemy.sql import *
from sqlalchemy.ext.associationproxy import association_proxy

log = logging.getLogger('nm_test')
logging.basicConfig(level=logging.DEBUG,
        format='%(asctime)s,%(msecs)03d %(levelname)s [%(filename)s.%(funcName)s @ %(lineno)d.%(thread)d] %(message)s')

engine = create_engine('sqlite:///:memory:', echo = False, echo_pool = False)
meta = MetaData()
meta.bind = engine

developer_table = Table('developer', meta,
    Column('id', Integer, primary_key=True, autoincrement = False),
    Column('name', String),
)

project_table = Table('project', meta,
    Column('id', Integer, primary_key=True, autoincrement = True),
    Column('name', String)
)

developer_project_table = Table('developer_project', meta,
    Column('developer_id', Integer, ForeignKey('developer.id'), primary_key = True),
    Column('project_id', Integer, ForeignKey('project.id'), primary_key = True),
    Column('status', String)
)

class Developer(object):
    projects = association_proxy('developerProjects', 'projects')
    def __str__(self):
        return 'Developer id:%i, name:%s' % (self.id, self.name)

class Project(object):
    developers = association_proxy('developerProjects', 'developers')
    def __str__(self):
        return 'Project id:%i, name:%s' % (self.id, self.name)

class DeveloperProject(object):
    def __str__(self):
        return 'DeveloperProject developer:%s, project:%s, status:%s' % (self.developer_id, self.project_id, self.status)

mapper(Developer, developer_table, properties = {
    'developerProjects':relation(DeveloperProject, backref = "developers")
})

mapper(Project, project_table, properties = {
    'developerProjects':relation(DeveloperProject, backref = "projects")
})

mapper(DeveloperProject, developer_project_table)

meta.create_all(engine)
conn = engine.connect()

conn.execute(project_table.insert(),[
    {'name':'stackoverflow'},
    {'name':'superuser'},
])
conn.execute(developer_table.insert(),[
    {'name':'John'},
    {'name': 'TerryJ'},
    {'name': 'TerryG'},
    {'name': 'Eric'},
    {'name': 'Graham'},
])
conn.execute(developer_project_table.insert(),[
    {'developer_id':1, 'project_id':1, 'status':'active'},
    {'developer_id':2, 'project_id':2, 'status':'inactive'},
    {'developer_id':3, 'project_id':2, 'status':'active'},
    {'developer_id':4, 'project_id':1, 'status':'active'},
    {'developer_id':4, 'project_id':2, 'status':'active'},
    {'developer_id':5, 'project_id':1, 'status':'active'},
    {'developer_id':5, 'project_id':2, 'status':'inactive'},
])

Session = sessionmaker(bind=engine)
s = Session()

developers = s.query(Developer).all()
projects = s.query(Project).all()

for d in developers:
    log.debug(d)
    for p in d.projects:
        log.debug('    %s' % p)

for p in projects:
    log.debug(p)
    for d in p.developers:
        log.debug('    %s' % d)

# does not work
activeDevelopers = s.query(Developer).filter_by(Developer.developerProjects.status == 'active').all()
# AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'status'

问题答案:

关联代理的使用any()方法:

s.query(Developer).filter(Developer.developerProjects.any(status='active'))


 类似资料:
  • 问题内容: 我在SQLAlchemy上没有太多经验,并且有一个我无法解决的问题。我尝试搜索,并且尝试了很多代码。这是我的课程(简化为最重要的代码): 我想查询所有母亲的phenoscore为(例如)的患者 如前所述,我尝试了很多代码,但我不明白。在我看来,合乎逻辑的解决方案是 因为,您可以在输出时访问每个元素,但是此代码不执行此操作。 是否有(直接)按关系的属性进行过滤的可能性(无需编写SQL语句

  • 问题内容: 我正在尝试通过联接表的属性过滤查询 我有2个表“城市和类别”,我正在通过第三个表CityCategory进行关联。想法是在时获取与城市关联的类别。是一个特定的整数。 这就是我指定关联的方式: 这是我当前使用的查询,未成功使用: 不幸的是,我不确定如何告诉续集使用CityCategory的year属性,而不是在Category模型中搜索名为“ year”的属性… 这是可能的还是我必须手动

  • 问题内容: 我有一个 我想过滤并仅保留值包含已知对的条目,比方说(’mike’=>’jordan’),并避免如下所示的循环 我所包含的库中是否有apache.commons和google.common的filter方法(也可能会执行循环,但至少不那么冗长 问题答案: 您可以使用来自Guava和界面的过滤器。 因此,简单的示例将是:

  • 问题内容: 我有一个用户表和一个朋友表。朋友表拥有两个外键,分别指向我的用户表和状态字段。我试图能够从Friend对象上的User表中调用属性。例如,我希望能够执行诸如friend.name或friend.email之类的操作。 当我得到对象时,我所拥有的只是2,并且我想显示每个用户的所有属性,以便可以在表单等中使用该信息。我对sqlalchemy还是陌生的- 仍在尝试学习更高级的功能。这只是一个

  • 问题内容: 如果我有一个对象数组,并且想将Angular模型绑定到基于过滤器的元素之一的属性,该怎么做?我可以用一个具体的例子更好地解释: HTML: 控制器: JSBin:http://jsbin.com/adisax/1/edit 我想将第二个输入过滤为具有’C’等级的主题,但是我不想将模型绑定到该 等级 ;我想将其绑定到等级为“ C”的主题的 标题 。 这可能吗?如果可以,怎么做? 问题答案

  • 问题内容: 我刚刚开始使用SQLAlchemy。我决定使用它,因为我在sqlite查询中间使用了很多字符串表达式。 所以,这就是我的问题。我的桌子上有很多设备,每个设备都有维护级别的日期。关键是用户可以选择他想在屏幕上看到的维护级别。因此,我应该为他选择的每种维护级别组合“调整”我的SQLAlchemmy。 例如,在原始SQLite中。 SELECT * WHERE(设备IN [])和m_leve