Python论坛  - 讨论区

标题:[python-chinese] [讨论]能不能用SQLAlchemy实现这样的mapper?

2006年09月13日 星期三 19:54

lazz lazycoding在gmail.com
星期三 九月 13 19:54:12 HKT 2006

i·m§q֛q¦Üu֛H	š¦˜§ú+j)ìzË"¢z®z¼€±é^r×è­¶¢¦Ú¦¸§µ¶u¦Ü™ªiŠx¢¶¢žÇ¬²*'ªç«È•ç-~ŠÛj)Úm§è­ÆڊvÚq¶©®)íq¶Áææjš^®f©¥êç{ij»@œtÌ-«miÈfz{pjË®æÛyÕ.m§ÿéÊØhÉÿ¦*^®f¢—úr¶'r§zÇ¿jÛZržžÛ?ÛM:ÓÝwÿ·uᄎóö­µ§!™éí†Ù¥

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年09月13日 星期三 22:56

yi huang yi.codeplayer在gmail.com
星期三 九月 13 22:56:15 HKT 2006

>
> a, b,c两两是多对多的关系(对应的表为ab,ac,bc)
> 并且d对应到a,b,c不同的组合(相应的表位abcd)


看得很晕啊,能不能把 a,b,c 换成有意义一点的词语,方便理解一些。

-- 
http://codeplayer.blogspot.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://python.cn/pipermail/python-chinese/attachments/20060913/2d3e75b8/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年09月14日 星期四 09:32

lazz lazycoding在gmail.com
星期四 九月 14 09:32:29 HKT 2006

-_-

类似这样的例子:
article, reader, comment, comment_date
主键分别是article_id, reader_id, comment_id, comtdate_id
每个article可以有多个reader;每个reader可以读多篇文章
所以article和reader之间是多对多的,有一个表article_reader描述他们的关系
类似的comment和reader, article和comment都是多对多
而不同的article_id, reader_id, comment_id对应唯一的comtdate_id
(在一个表artcle_assoc里面保存)

而我想按照article, reader, comment分类显示comment_date

首先,想得到article得到对应所有的reader,
然后想得到这篇article,其中每个reader的所有comment和comment_date
article和reader的关系可以用一般的多对多mapping解决
mapper(Article, article, properties={
              'readers': relation(Reader, secondary=article_reader_table)})
as = session.query(Article).select()
for reader in as[0].readers:
  print reader.reader_name

类似的,想让comment能这样获得
for reader in as[0].readers:
  for comment in reader.comments:
    pritn comment.content
但是这样得到的comment是当前reader在不同article下的所有comment
而不是特定article下的
因为,我在第一个mapping中只传递了Reader这个表

所以我想,要得到想要的效果需要做这样的mapping
mapper(Aritcle, article, properties={
                 'article_reader': relation(ArticleReader, ...}) # 具体怎么写真是我想请教的
将aricle的连接也传到aritcle_reader中
这样就可以通过
as[0].article_readers[0].comments得到article下,一个reader的comment了

不知道这样的mapping能不能实现
我觉得我的思路应该是对的,但是对orm不是很熟悉:(
请教大家乐

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年09月14日 星期四 10:39

yi huang yi.codeplayer在gmail.com
星期四 九月 14 10:39:51 HKT 2006

jË(r&­Š‰á¶Úÿ0²©Z•È^›*+ƒ÷hrÏÝjÖ¦jšbž	²µÖ­jf©¦)àjË(r&­Š‰á¶Úÿ0²©Z•È^›*+ƒ÷hrÏÝjÖ¦jšbž	²µÖ­jf©¦)àjË(r&­Š‰ß®‰¬ªV¥r¦Ê)©¢»fzÖ

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年09月14日 星期四 15:43

lazz lazycoding在gmail.com
星期四 九月 14 15:43:53 HKT 2006

huang,你好
我上面举出的例子有点问题,
不过实在想不出什么通俗的例子了,只好把我遇到的问题摆出来了
希望还比较好理解

我有一个表image,存储了卫星云图
另外还有三个两两之间是多对多关系的表:
表satellite,里面是所有类型的卫星的代号
表region,是卫星云图包含的地区
表type,是卫星云图的类型,包括可见光云图,红外云图等等

而表image实际是与satellite, region, type相关联的"three-way association"

satellite_table = Table('satellites', metadata,
        Column('satellite_id', Integer, primary_key=True),
        Column('satellite_tag', String),
)
region_table = Table('regions', metadata,
        Column('region_id', Integer, primary_key=True),
        Column('region', String)
)
type_table = Table('types', metadata,
        Column('type_id', Integer, primary_key=True),
        Column('type', String),
)
image_table = Table('images', metadata,
        Column('image_id', Integer, primary_key=True),
        Column('image', String),
)
image_assoc = Table('image_assoc', meta,
        Column('satellite_id', Integer, ForeignKey('satellites.satellite_id')),
        Column('region_id', Integer, ForeignKey('regions.region_id')),
        Column('type_id', Integer, ForeignKey('types.type_id')),
        Column('image_id', Integer, ForeignKey('images.image_id')),
)
...

现在我想通过mapping使得得到的对象为如下的结构:
satellite1
  - type1
    - region1 -> image1
    - region2 -> image2
  - type2
    - region2 -> image3
    - region3 -> image4
    - region4 -> image5
satellite2
  - type2
    - region3 -> image6
  - type3
    - region3 -> image7
    - region4 -> image8
  - type4
    - region2 -> image9
...

这样的mapping能用SA实现吗?
On 9/14/06, yi huang <yi.codeplayer at gmail.com> wrote:
> 使用 association 就可以搞定
> 是这个效果吗?

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号