簡體   English   中英

使用sqlalchemy的重復數據刪除數據庫架構-如何用ORM語義表示組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM