I am
running into a confusing "can't operate on multiple entity groups in a
single transaction" case when I am, in fact, not accessing "multiple entity
groups". I think I understand what might be going on, but A) am not
certain and B) others might find it interesting, anyway.
What is happening is that I have a transaction that
is operating over two models: GoogleUser and Account. I get the GoogleUser
instance associated with the current e-mail address with get_by_key_name and
then return gooser.account. If I fail to find that GoogleUser, I add a new
Account, and into the /same entity group/ I add the GoogleUser in
question.
For reference, here is the actual code of my
transaction:
132
@staticmethod
133 def
goi_account_by_primary_key_(user, hash, **kw):
134 gooser =
GoogleUser.get_by_key_name(hash)
135 if
gooser:
136
account = db.get(gooser.account)
137 keys
= kw.keys()
138 for
key in keys:
139
setattr(account, key, kw[key])
140
account.put()
141 else:
142
account = Account(**kw)
143
account.put()
144
gooser = GoogleUser(parent=account, key_name=hash, user=user,
account=account)
145
gooser.put()
146 return
account
Note that moving the creation of the gooser above
the creation of the account (and swapping the parent/child relationship between
them and making other required code changes to temporarily support that) does
work.
Why does this happen?
Currently my two theories are: A) the
detection code is incorrect, and is making assumptions about "same model", and
B) entities that don't exist yet are only considered in the same entity
group as that entity itself, so even though I'm going to create that entity
later into the same entity group, I can't put a different object first as the
data store can't tell the difference. I am guessing that B is correct, in which
case maybe someone else working on this same problem will find this post and be
helped by it. If it isn't B, then maybe someone would be kind enough to tell me
what the problem actually is ;P.
-J