Days of Liris
2007/01/25
SQLObjectのRelatedJoinで変なこと
Author: liris
-
Modified: 2007/01/25 17:14
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プロパティのページング
Author:
aodagの日記
-
Modified: 2007/01/26 21:08
http://www.liris.org/blog/sqlobject306erelatedjoin5909306a30533068 Pythonicな指定方法はやっぱりなさげ。 RelatedJoinのプロパティが遅延ロードで、リストで帰ってきちゃう。 ここがSResultになってさえいればもっとやりようがありそうなのに。 あとは、SQLJoinがどれ