Thanks! It works with the query using the "long" syntax: *db(db.table_name.id 
== key).select().first()*
The short version *db.table_name(key)* does returns *None* as it performs a 
check if key is an integer first.
However, using a query instead of a key also works: 
*db.table_name(db.table_name.id 
== key)*

The other shortcut *db.table_name[key]* could work if the DAL Table code is 
altered to detect app engine Key instance. See the patch below (also 
includes your changes).

diff -r 3070c65f3e19 gluon/dal.py
--- a/gluon/dal.py    Mon Oct 17 08:20:27 2011 -0500
+++ b/gluon/dal.py    Mon Oct 17 18:01:14 2011 +0100
 
@@ -3381,10 +3350,10 @@
     def select(self,query,fields,attributes):
         (items, tablename, fields) = 
self.select_raw(query,fields,attributes)
         # self.db['_lastsql'] = self._select(query,fields,attributes)
-        rows = [
-            [t=='id' and (int(item.key().id()) if item.key().id() else 
-                          item.key().name()) or getattr(item, t) for t in 
fields]
-            for item in items]
+        rows = []
+        for item in items:
+            row = [t=='id' and item.key().id_or_name() or getattr(item, t) 
for t in fields]
+            rows.append(row)
         colnames = ['%s.%s' % (tablename, t) for t in fields]
         return self.parse(rows, colnames, False)
 
@@ -4913,13 +4860,13 @@
             if rows:
                 return rows[0]
             return None
-        elif str(key).isdigit():
+        elif str(key).isdigit() or isinstance(key, Key):
             return self._db(self._id == key).select(limitby=(0,1)).first()
         elif key:
             return dict.__getitem__(self, str(key))

Reply via email to