[英]A Deduplication DB schema with sqlalchemy - How to represent a group with ORM semantics?
我正在嘗試使用mysql和使用sqlalchemy進行程序訪問來為實體重復數據刪除架構創建一個簡單的表示形式。
我正在嘗試實現一種特定的效果,我認為這是一種自我參照查詢,但我不確定:
本質上,我有一個“實體”表(具有唯一的entity_id)和一個關聯的實體對象,然后有一個entity_groups表(為簡單起見)具有一個“ group_id”和“ entity_id”列,以便我用一個通過為該關系創建一行來進行分組。 該表也與ORM對象EntityGroup相關聯。
問題是,如何獲取EntityGroup對象引用組中的所有實體?
我希望我需要寫一些類似的東西:
mapper(EntityGroup,entity_groups_table,properties = {'entities':Relationship(Entity,....?)},
我在細節上有點模糊。 基本上,我需要entity_groups中與對象表示的行具有相同group_id的所有行。 然后,我需要實現與那些行的entity_id列相關聯的所有Entity對象。 這聽起來像是通過sqlalchemy中更詳細的Query()操作可以實現的,但是我不確定如何將其與Relationship()構造結合使用(如果有的話,也許要手動進行?)
任何幫助都將是有用的,我希望我清楚並切題
您實際上不應該使用Query
執行此操作,因為如果您正確配置了關系,您將自動獲得此信息。 假設您僅使用entity_group
表來存儲關系,而沒有其他任何使用,則應按照文檔中所述配置多對多關系。 充分發揮作用的示例應有所幫助:
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>]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.