google.appengine.ext.db 包提供以下函数:
获取任何 Model 的指定键的实体。
参数:
如果提供了一个 Key,则返回值是相应 Model 类的实例,或者是 None(如果指定键没有实体)。如果提供了 Key 列表,则返回值是 Model 实例的对应列表,并且在对应 Key 不存在实体时该列表会具有 None 值。
另请参阅 Model.get()。
将一个或多个 Model 实例放置到数据库中。
参数:
如果指定了多个 Model 实例,它们可能存储于多个实体组中。在每个实体组中,所有属于该组的实体都将在一个事务中写入。请参阅键和实体组。
如果在操作过程中发生错误,则肯定会抛出异常,即便某些实体其实已经写入。如果调用中的实体跨越多个实体组就可能发生这种情况。如果调用返回而没有抛出异常,则表示所有实体都已成功写入。
返回与存储的 Model 实例对应的 Key 对象(如果指定了 Model 实例)或 Key 对象的列表(如果指定了实例列表)。
从数据库中删除一个或多个 Model 实例。
参数:
如同 Model.put() 一样,如果指定了多个键,它们可能位于多个实体组中。在每个实体组中,所有属于该组的实体都将在一个事务中删除。请参阅键和实体组。
如果在操作过程中发生错误,则肯定会抛出异常,即便某些实体其实已经删除。如果调用中的键跨越多个实体组就可能发生这种情况。如果调用返回而没有抛出异常,则表示所有实体都已成功删除。
在一个事务中运行包含数据库更新的函数。如果代码在事务过程中抛出异常,则事务中进行的所有数据库更新都将回滚。
参数:
如果函数返回一个值,run_in_transaction() 将该值返回到调用程序。
如果函数抛出异常,事务将回滚。如果函数抛出 Rollback 异常,该异常不会再次抛出。对于其他任何异常,会针对调用程序再次抛出异常。
数据库使用乐观锁定并重新尝试事务。如果无法提交函数准备的事务,run_in_transaction() 将再次调用函数,然后重复固定次数的重新尝试。由于可能针对一个事务调用多次事务函数,所以函数不应有副作用,包括对参数的修改。
例如,如果由于高冲突率而无法提交事务,将抛出 TransactionFailedError。
有关事务的详细信息,请参阅事务。
def decrement(key, amount=1):
counter = db.get(key)
counter.count -= amount
if counter.count < 0: # don't let the counter go negative
raise db.Rollback()
db.put(counter)
q = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", "foo")
counter = q.get()
db.run_in_transaction(decrement, counter.key(), amount=5)