0

mysql を使用し、プログラムによるアクセスに sqlalchemy を使用して、エンティティ重複排除スキーマの単純な表現を作成しようとしています。

私は一種の自己参照クエリだと思う特定の効果を達成しようとしていますが、よくわかりません:

基本的に、「entities」テーブル (一意の entity_id を持つ) と関連付けられた Entity オブジェクトがあり、次に (簡単にするために)「group_id」列と「entity_id」列を持つ entity_groups テーブルがあり、エンティティを「登録」します。そのリレーションの行を作成してグループ化します。このテーブルも ORM オブジェクト (EntityGroup) に関連付けられています。

質問は、グループ内のすべてのエンティティを参照する EntityGroup オブジェクトを取得するにはどうすればよいですか?

次のようなものを書く必要があると思います:

mapper(EntityGroup, entity_groups_table, properties={ 'entities': relationship(エンティティ, .... ?) },

そして、私は詳細について少し曖昧です。基本的に、オブジェクトによって表される行と同じ group_id を持つ entity_groups 内のすべての行が必要です。次に、これらの行の entity_id 列に関連付けられたすべてのエンティティ オブジェクトを具体化する必要があります。これは、sqlalchemy のより詳細な Query() 操作で達成できるもののように思えますが、それを relationship() 構造と組み合わせる方法がわかりません (もしあれば - おそらく手動にしますか?)

どんな助けも役に立ちます。私が明確で要点がはっきりしていることを願っています

4

1 に答える 1

0

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>]
于 2011-04-19T06:43:55.350 に答える