Login
  Days of Liris

2007/01/25

SQLObjectのRelatedJoinで変なこと

Tag: dev

SQLObjectのRelatedJoinは便利なんですが、RelatedJoinした両方のクラスに対してselectの条件を指定するのって、どうやるんだろう?と言うのが疑問でした。aodagさんに聞いても分かんなかったので、と言うか、例のプロダクトでタグによるセレクションをしたかったので、調べてみました。クラスはこんな感じにデザインしています。

class Entry(SQLObject):
    tags = ReleatedJoin("Tag")
    いろいろ

class Tag(SQLObject):
    entries = RelatedJoin("Entry")
    name = UnicodeCol(alternateId = True)

これで、テーブルを作ると、entry, tag, entry_tagのテーブルができます。entry_tagは二つのカラムがあって、entry_idとtag_idです。それぞれがEntry.idとTag.idに対応しています。

では、やりたいことは、Tagの名前がhogeでEntryの条件はいろいろ。と言うものです。Entryの条件はここでは省略。さて、これをやるには、こんな感じ。

from sqlobject.sqlbuilder import *

sresult = Entry.select(
    AND(table.entry_tag.tag_id == Tag.byName("hoge").id,
        table.entry_tag.entry_id == table.entry.id, *extraConditions),
    distinct = True)

です。これで、必要なものだけがセレクションされます。SQLBuilderでSQLを組み立てようとしましたが、ちょっと癖があって使いにくい。まあ、複雑なSQLの場合ですが。

で、SQLBuilderのtableで、どんなテーブル(この場合はentry_tag)へもアクセスできるのでいい感じ。本当にいいことなのかは分からんが。

SQLObjectのはくsql(DBはsqliteね)を見ていると、InheritableSQLObjectを使っているとすごいことになっています。そんな感じ。


[Python][TurboGears][SQLObject] MultiJoinプロパティのページング

http://www.liris.org/blog/sqlobject306erelatedjoin5909306a30533068 Pythonicな指定方法はやっぱりなさげ。 RelatedJoinのプロパティが遅延ロードで、リストで帰ってきちゃう。 ここがSResultになってさえいればもっとやりようがありそうなのに。 あとは、SQLJoinがどれ
Captcha Image