Having been eyeball deep in App Engine for a while, evaluating it for a project at work and putting together a presentation for the utah open source conference, I've reluctantly concluded that I don't like it. I want to like it, since it's a great poster child for Python. And there are some bright spots, like the dirt-simple integration with google accounts. But it's so very very primitive in so many ways. Not just the missing features, or the "you can use any web framework you like, as long as it's django" attitude, but primarily a lot of the existing API is just so very primitive.
The DataStore in particular feels like a giant step backwards from using a traditional database with a sophisticated ORM. Sure, it can scale if you use it right, but do you really know what that entails?
Take the example of simple counting of objects. There's a count() method, but in practice, it's so slow you can't use it. Denormalize with a .count property? Yeah, that doesn't scale either: what you really need is a separate, sharded Counter class. And yes, sharding is very, very manual. (See slides 18-23 in the link there, and the associated video starting about 19:00.)
You can't perform joins in GQL. Or subselects. Or call functions, aggregate or otherwise. EVERYthing you are interested needs to be pre-computed. (Or computed by hand client-side, which is so slow it's barely an option at all.) I can extrapolate from this to my experience in production schemas and it's not pretty.
Of course, you also lose any ability to write declarative, set-based code, which is demonstrably less error-prone than the imperative alternative. Take a simple example from my demo app. Marking a group of todo items finished is four statements:
items = TodoItem.get_by_id( [int(id) for id in request.POST.getlist('item_id')]) for item in items: item.finished = datetime.now() item.put()
Compare this with SQL:
cursor.execute("update todo_items set finished = CURRENT_TIMESTAMP where id in %s", ([int(id) for id in request.POST.getlist('item_id')]))Scalability is great but taking a big hit to back-end productivity is too high a price for all but a few applications. GAE is still young, so maybe Google will improve things, but their attitude so far seems to be "we know how to scale so shut up and do it the hard way." I hope I am wrong.