0

我正在尝试使用 mysql 为实体重复数据删除模式创建一个简单的表示,并使用 sqlalchemy 进行编程访问。

我正在尝试实现一种特定的效果,我认为这是一种自我参照查询,但我不确定:

本质上,我有一个“实体”表(具有唯一的 entity_id)和一个关联的 Entity 对象,然后是一个 entity_groups 表,该表(为简单起见)有一个“group_id”和“entity_id”列,因此我“注册”一个实体通过为该关系创建一行来分组。该表也与一个 ORM 对象 - EntityGroup 相关联。

问题是,如何让 EntityGroup 对象引用组中的所有实体?

我希望我需要写一些类似的东西:

映射器(EntityGroup,entity_groups_table,属性={'实体':关系(实体,...。?)},

我对细节有点模糊。基本上我需要 entity_groups 中与对象表示的行具有相同 group_id 的所有行。然后我需要具体化与这些行的 entity_id 列关联的所有实体对象。这听起来像是可以通过 sqlalchemy 中更详细的 Query() 操作来实现的,但我不确定如何将它与 relationship() 构造结合起来(如果有的话 - 也许可以手动操作?)

任何帮助都会很有用,我希望我说的很清楚

4

1 回答 1

0

你真的不应该使用 a 来做Query,好像你正确配置了关系你会自动得到它。假设您entity_group只使用 table 来存储关系而不是其他任何东西,您应该按照文档配置多对多关系。完整的工作示例应该会有所帮助:

from sqlalchemy import create_engine, Column, Integer, String, MetaData, ForeignKey, Table
from sqlalchemy.orm import relationship, mapper, scoped_session, sessionmaker, backref
from sqlalchemy.ext.associationproxy import association_proxy

# Configure test DB
engine = create_engine(u'sqlite:///:memory:', echo=False)
session = scoped_session(sessionmaker(bind=engine, autoflush=False))
metadata = MetaData()

# tables
entities_table = Table('entities', metadata,
    Column('entity_id', Integer, primary_key=True),
)

groups_table = Table('groups', metadata,
    Column('group_id', Integer, primary_key=True),
)

entity_groups_table = Table('entity_groups', metadata,
    Column('entity_id', Integer, ForeignKey('entities.entity_id'), primary_key=True),
    Column('group_id', Integer, ForeignKey('groups.group_id'), primary_key=True),
)

# object model
class Group(object):
    def __repr__(self): return "<Group: %d>" % (self.group_id,)
class Entity(object):
    def __repr__(self): return "<Entity: %d>" % (self.entity_id,)

# mappers
mapper(Group, groups_table)
mapper(Entity, entities_table, 
       properties={'groups': relationship(Group, secondary=entity_groups_table, backref='entities')},
       )

# create db schema
metadata.create_all(engine)

# == TESTS
# create entities
e1 = Entity()
e2 = Entity()
g1 = Group()
g2 = Group()
g3 = Group()
g1.entities.append(e1)
g2.entities.append(e2)
g3.entities.append(e1)
g3.entities.append(e2)
session.add(e1)
session.add(e2)
session.commit()

# query...
session.expunge_all()

# check Peter
for g in session.query(Group).all():
    print "group: ", g, " has ", g.entities

应该产生类似的东西:

group:  <Group: 1>  has  [<Entity: 1>]
group:  <Group: 2>  has  [<Entity: 1>, <Entity: 2>]
group:  <Group: 3>  has  [<Entity: 2>]
于 2011-04-19T06:43:55.350 回答