2008-06-14

Datastoreでの重複値チェック

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Google App Engineでデータベースの役割をするDatastoreではデータを追加すると勝手に主キーにあたるKeyを設定してくれる。
ただしこのKey値はなんかランダム(?)な文字列と一応id(数値)が対応づけられている。
idの変わりにnameというこちらで指定した文字列を設定しておくことができるようです。
なので、このname部分を重複値チェック用に使ってみることにしてみた。

Key値を自分で作るには
Key.from_path
を利用するみたい。
利用する際には
k = db.Key.from_path(キーを設定するモデル名, 設定するキー値)
って感じで使えばよいみたい。
ここの設定するキー値は数値で始まってはいけないようです。

以下は、トランザクションを利用して登録前に複数のカラムで重複チェックをしている例

------------------
from google.appengine.ext import db

class Samples(db.Model):
 col1 = db.StringProperty(required=True)
 col2 = db.StringProperty(required=True)

def add_new(c1,c2):
 #c1の最初が数値で始まるかもしれないので念のため固定値を付与しておく
 kname = "id" + c1 + "__" + c2
 obj = db.get(db.Key.from_path("Samples", kname))
 if not obj:
  obj = Samples(key_name = kname,col1 = c1,col2 = c2)
  obj.put()
 else:
  raise db.TransactionFailedError

c1 = "aaa"
c2 = "bbb"
try :
 db.run_in_transaction(add_new,c1,c2)
 print '登録成功'
except db.TransactionFailedError:
 print 'すでに利用されている組み合わせです'
try :
 db.run_in_transaction(add_new,c1,c2)
 print '登録成功2'
except db.TransactionFailedError:
 print 'すでに利用されている組み合わせです2'
------------------

実際にちゃんと動かして試してないですが、こんな感じで使えると思います。
以下のように出てくると思います。
登録成功
すでに利用されている組み合わせです2


ちょっとこれでいいのかどうかわからないのが、トランザクションを中止するときに
db.TransactionFailedError
をraiseしていいのかどうかがよくわからないのですけどね。
実際は、自分用のエラーとかを作った方がよいのかな?
コメントを投稿