I finally got back to this. using web2py trunk there was a minor
modification to dal.py in the attached patch to make the following example
work:
db.define_table('funtest',
Field('name', length=128))
def create_one():
id = request.args[0]
from google.appengine.ext import db as gae
class funtest(gae.Expando):
name = gae.StringProperty(required=False)
item = funtest(key_name="label:"+id,name='bob')
item.put()
return "done"
def read_one():
id = request.args[0]
from google.appengine.api.datastore_types import Key
from google.appengine.ext import db as gae
key = Key.from_path("funtest","label:"+id)
#this fails, unknown key exception
entity_keyid = db.funtest[key]
entity_keyselect = db(db.funtest.id == key).select().first()
entity_keyid2 = db.funtest(key) #this returns None
from google.appengine.ext import db as gae
entity_gae = gae.get(key)
return dict(key=key,
entity_keyselect=entity_keyselect,
entity_keyid2=entity_keyid2,
entity_gae=entity_gae)
Note that i had to create_one before i read_one and i have to use the same
ID arg to each method. also, if i defined the model class in the same
method as i was doing the DAL query GAE gets confused because there are 2
definitions of the same class. also your other DAL code must not assume
that the ID for this table is an int (which we often do). i think it might
break things like default representations etc.
i suppose the follow-on question is going to be "how do i set a named key
using DAL". lemme know if there is interest there and i'll dig into it.
massimo - do you need a google code issue for the patch? is web2py OK with
an ID that is a string? it worked in the simple example but i don't know if
other features expect the ID field to be an int.
christian