2010/03/18

[Google App Engine]トランザクション処理

昨日のエントリーでは、データを登録する方法を書いたので、今日は、トランザクション処理について。

import cgi
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

#データモデル
class PaintingData(db.Model):
personalid = db.StringProperty()

def insert_data(*args):
#トランザクションの実行
paintingdata = PaintingData()
paintingdata.personalid = args[0].request.get("personalid")
#コミットをかける
paintingdata.put()


class StoringData(webapp.RequestHandler):
def post(self):
# print self.request.get("hoge")

try:
db.run_in_transaction(insert_data,self)
except:
print "エラーが発生しました。"

#データを表示する
def get(self):
paintingdata = db.GqlQuery("SELECT * FROM PaintingData")
for each_paintingdata in paintingdata:
self.response.out.write("<div>personalid:%s</div>" %
each_paintingdata.personalid)

application = webapp.WSGIApplication(
[('/paint/storingdata', StoringData)]
, debug=True
)


def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()

db.run_in_transactionファンクションの使い方がわからなかったため、ちょっとてこずりました。

リファレンスを読むと第一引数は、関数の名前なのはすぐにわかったのですが、第二引数と第三引数に悩みました。

初めてのPythonを参考にすると、「*args」は、引数をタプルで受け取り、「**kargs」は、ディクショナリで受け取ると書いてあったので、今回は、タプルで渡したいと思い、第三引数を何も指定せずに、関数の設定を行ったところ、きちんと正常動作しました。

呼び出される関数(第一引数)の引数もタプルで設定してあるため、db.run_in_transactionの第二引数がそっくりそのまま引き渡される形になります。

後は、例外処理を細かく書いていけばオッケーかなーっと。

0 コメント:

コメントを投稿