Entity Groupと親指定 (python)

42 views
Skip to first unread message

Kaz

unread,
Sep 15, 2009, 9:01:26 PM9/15/09
to Google-App-Engine-Japan
はじめまして、Google App Engine 新参者の中山と申します。
現在、チケット配布サーバーのようなものを作っているのですが、Entity Groupの作り方で質問させてください。

モデルクラスを継承した以下のクラスがあるとします。

from google.appengine.ext import db

# Counter: 現在の発行数を管理
class MyCounter(db.Model):
counter = db.IntegerProperty(required=True, default=0)

# Ticket: 発行予定チケットマスター:bulkloader でCSVからデータをアップロード
class Ticket(db.Model):
ticket_id = db.IntegerProperty()
ticket_string = db.StringProperty()

# IssueLog: チケット発行ログ
class IssueLog(db.Model):
issue_date = db.DateProperty()
ticket_id = db.IntegerProperty()
ticket_string = db.StringProperty()

ーーーーー

チケットの発行処理をするにあたり、

(1) 現在のMyCounter.counter値を取得
(2) MyCounter.counterをticket_idとするTicketを取得
(3) Ticket.ticket_stringを戻す
(4) 新規IssueLogを生成

としたいのですが、上記処理を1つのトランザクションで実施するためには全てのEntityが同一Entityグループに入っている必要があります。

そこで、MyCounterを親、TicketとIssueLogをその子としてEntity Groupを作ろうと思いました。

IssueLogはトランザクション内で生成するので、その際にparent指定ができるのですが、Ticketはbulkloader でCSVにて
アップロードする際に親指定(MyCounter)をどのようにすれば良いかわかりません。いくつか適当に試してみましたが、だめでした。

この辺のご経験をお持ちの方がいらっしゃったら、ご教授いただければ幸いです。


Takashi Matsuo

unread,
Sep 15, 2009, 11:52:37 PM9/15/09
to google-app-...@googlegroups.com
松尾です。

bulkloader のソースを見た限り、Loader を extend したクラスで
generate_key() を override すれば行けそうですね。このメソッドの返り値が
datastore.Key (db.Keyでも同じ) なら、最終的に parent が指定された
entity ができます。

ただ現時点では Key を手動で作成するには key_name を指定する必要がありま
すね。それが少し面倒かもしれません。ただ今だと数字で始まる key_name も
許されるようになったので前よりは良いですが。


あとですね、そもそも Ticket はこの Entity Group に入れる必要ありますか?
bulkload した後は値が変わらないのですよね?

読み違えていたら済みません。


Happy coding :-)

--
Takashi Matsuo
The father of kay framework





2009/9/16 Kaz <kazushige...@gmail.com>:

Yasuo Higa

unread,
Sep 16, 2009, 12:06:24 AM9/16/09
to google-app-...@googlegroups.com
ひがです。
>
> 松尾です。

>
> ただ現時点では Key を手動で作成するには key_name を指定する必要がありま
> すね。それが少し面倒かもしれません。ただ今だと数字で始まる key_name も
> 許されるようになったので前よりは良いですが。
>
Java版だと、SDK 1.2.5からallocateIds
でputしなくても自動生成されたKeyが取得できるようになりました。
http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/DatastoreService.html#allocateIds%28java.lang.String,%20long%29

Python版にもないですか?

Kaz

unread,
Sep 16, 2009, 12:27:23 AM9/16/09
to Google-App-Engine-Japan
中山です。

リプライありがとうございます。
Ticketは読み込みのみなのでEntity Groupに入れたくないのですが、トランザクション関数内でMyCounter.counterの値
をロックした状態でその値をキーにしてTicketを読みに行く必要があるので入れようとしているだけなのですが、それを回避する方法があればベストか
もしれません。それは可能なのでしょうか。

On Sep 16, 3:52 pm, Takashi Matsuo <matsuo.taka...@gmail.com> wrote:
> 松尾です。
>
> bulkloader のソースを見た限り、Loader を extend したクラスで
> generate_key() を override すれば行けそうですね。このメソッドの返り値が
> datastore.Key (db.Keyでも同じ) なら、最終的に parent が指定された
> entity ができます。
>
> ただ現時点では Key を手動で作成するには key_name を指定する必要がありま
> すね。それが少し面倒かもしれません。ただ今だと数字で始まる key_name も
> 許されるようになったので前よりは良いですが。
>
> あとですね、そもそも Ticket はこの Entity Group に入れる必要ありますか?
> bulkload した後は値が変わらないのですよね?
>
> 読み違えていたら済みません。
>
> Happy coding :-)
>
> --
> Takashi Matsuo
> The father of kay framework
>
> 2009/9/16 Kaz <kazushige.nakay...@gmail.com>:

Takashi Matsuo

unread,
Sep 16, 2009, 12:32:50 AM9/16/09
to google-app-...@googlegroups.com
松尾です。

Python にも

db.allocate_ids()

があります。ただ、今のところ bulkloader を使う場合は entity に id を指
定できないのです。

google.appengine.api.datastore の低レベル api を使うと id を指定して
entity を保存できますね。このあたりは Java 版も同じですかね。

ですので remote_api を使用して自前でやれば id でも可能と思われます。

Happy coding :-)

--
Takashi Matsuo
The father of kay framework


2009/9/16 Yasuo Higa <higa...@gmail.com>:

Takashi Matsuo

unread,
Sep 16, 2009, 12:51:12 AM9/16/09
to google-app-...@googlegroups.com
松尾です。

MyCounter.counter の値から Ticket の Key が作成できるようにしておき、
IssueLog には Ticket への Reference のみ保持するようにすればどうでしょうか。

ticket_string の値で IssueLog を検索する必要が無ければこれでいけるので
は無いでしょうか。ただ Missing Entity には注意ってとこですかね。

元々の設計だと、bulkload 中にチケット発行しようとすると厳しいんじゃない
かと思います。

Happy coding :-)

--
Takashi Matsuo
The father of kay framework



2009/9/16 Kaz <kazushige...@gmail.com>:

Kaz

unread,
Sep 16, 2009, 1:09:57 AM9/16/09
to Google-App-Engine-Japan
はい、レファレンスのみで行くという方法が一番シンプルかもしれませんね。
学び初めだと何ができて何ができないのかどうも考えてしまい思考停止状態でした。おかげさまで、いろいろアイディアが湧いてきました。どうもありがとう
ございました。

中山

On Sep 16, 4:51 pm, Takashi Matsuo <matsuo.taka...@gmail.com> wrote:
> 松尾です。
>
> MyCounter.counter の値から Ticket の Key が作成できるようにしておき、
> IssueLog には Ticket への Reference のみ保持するようにすればどうでしょうか。
>
> ticket_string の値で IssueLog を検索する必要が無ければこれでいけるので
> は無いでしょうか。ただ Missing Entity には注意ってとこですかね。
>
> 元々の設計だと、bulkload 中にチケット発行しようとすると厳しいんじゃない
> かと思います。
>
> Happy coding :-)
>
> --
> Takashi Matsuo
> The father of kay framework
>
> 2009/9/16 Kaz <kazushige.nakay...@gmail.com>:

Takashi Matsuo

unread,
Sep 16, 2009, 1:11:55 AM9/16/09
to google-app-...@googlegroups.com
松尾です。

補足を少し。

http://billkatz.com/2009/9/Pre-allocating-IDs-for-App-Engine-datastore

のコメント欄(Ryan BarrettはGoogle社員)によると、1.2.6 では db.Model と
db.Expando に key を指定できるようになる(つまり間接的に id を指定できる
ようになる)ので、正式にドキュメントも書きますよとの事です。

bulkloader でも対応されると良いですね。

ただし、今の db.allocate_ids や datastore.AllocateIds には第一引数とし
て parent (又はその Key)を渡す必要があるようなのです。parent 無しの
allocate_ids は出来ないのかな。これがちょっと気になりますね。

ちょっと irc ででも聞いてみましょうか。

Happy coding :-)

--
Takashi Matsuo
The father of kay framework


2009/9/16 Takashi Matsuo <matsuo....@gmail.com>:

Yasuo Higa

unread,
Sep 16, 2009, 1:41:14 AM9/16/09
to google-app-...@googlegroups.com
ひがです。

>
> 松尾です。
>
> Python にも
>
> db.allocate_ids()
>
> があります。ただ、今のところ bulkloader を使う場合は entity に id を指
> 定できないのです。
>
> google.appengine.api.datastore の低レベル api を使うと id を指定して
> entity を保存できますね。このあたりは Java 版も同じですかね。
>
Java版でもできます。
後、allocateIdsで親のKeyではなく、Kindだけを指定するメソッドもあります。

> ですので remote_api を使用して自前でやれば id でも可能と思われます。
>

いまだに、remote_api は、Javaにはないですね。残念。

Reply all
Reply to author
Forward
0 new messages