Python 2.7 has reached end of support
and will be deprecated
on January 31, 2026. After deprecation, you won't be able to deploy Python 2.7
applications, even if your organization previously used an organization policy to
re-enable deployments of legacy runtimes. Your existing Python
2.7 applications will continue to run and receive traffic after their
deprecation date. We recommend that
you migrate to the latest supported version of Python.
Stay organized with collections
Save and categorize content based on your preferences.
Functions
ndb.add_flow_exception(exc)
Specify that an exception should not be logged, but is just part of
normal program flow. (Normally, raising an exception writes a warning
message to the application's logs.)
Arguments
exc
Exception class that should not be logged.
By default, the following exceptions are not logged:
webob.exc.HTTPException (and its subclasses)
ndb.Rollback
ndb.delete_multi(keys, **ctx_options)
Deletes entities identified by the passed sequence of keys.
Decorator to ensure that a function runs outside a transaction.
Arguments:
allow_existing
If True (the default) and if the decorated function
is called by code in a transaction, the function runs independent
of the transaction. If False and if the decorated function
is called by code in a transaction, it raises an exception.
Returns a Future.
The future returns whatever callback returns, or
raises whatever callback raises or a
TransactionFailedError if the
transaction fails.
To pass arguments to a callback function, use a lambda. For example,
Context options allow you to run specific datastore operations with different
configurations. For example, you might want to vary the read policy
or the RPC deadline for individual requests.
You can do this by passing context options to almost any operation.
Some transaction-related functions take transaction options, which include additional options
on top of a set of context options.
Here are a few examples using context options. To set the RPC deadline to 1 second when reading an entity,
you can use:
key.get(deadline=1)
To set the memcache timeout to 30 seconds when writing an entity,
you can use:
ent.put(ndb_memcache_timeout=30)
To delete an item that has been cached and force its reload, you can use:
key.delete(use_datastore=False)
The special keyword arguments options and config
(which have identical meanings for historical reasons) allow one to specify
several options as a Configuration object. This can be an
ndb.ContextOptions object or
(for the transactional functions and decorator) an
ndb.TransactionOptions object.
For example,
key.get(options=ndb.ContextOptions(use_cache=True))
is equivalent to
key.get(use_cache=True).
The options set in such an options object can be overridden by
keyword parameters.
The following context options are available:
Option
Type
Description
deadline
float
Datastore call deadline, specified as a number of seconds.
(By default, the call is only interrupted by the
request handler deadline.)
read_policy
ndb.EVENTUAL_CONSISTENCY
Set this to ndb.EVENTUAL_CONSISTENCY if, instead of
waiting for the Datastore to finish applying changes to all returned
results, you wish to get possibly-not-current results faster.
force_writes
bool
Specifies whether a write request should succeed even if the app is read-only.
(This only applies to user controlled read-only periods.)
use_cache
bool
Specifies whether to store entities in in-process cache; overrides in-process cache policy for this operation.
use_memcache
bool
Specifies whether to store entities in memcache; overrides memcache policy for this operation.
use_datastore
bool
Specifies whether to store entities in Datastore; overrides Datastore policy for this operation.
memcache_timeout
int
Maximum lifetime for entities in memcache; overrides memcache timeout policy for this operation.
max_memcache_items
int
Maximum batch size for the auto-batching feature of the
Context memcache methods.
For example, with the default size of max_memcache_items
(100), up to 100 memcache set operations will be combined into a
single set_multi operation.
For some transaction-related functions,
the following transaction options are available
(along with the inherited context options listed above):
Option
Type
Description
xg
bool
Allow cross-group (XG) transactions.
False by default.
propagation
int
NDB provides limited support for transactions within transactions, which
are known as "nested transactions".
The propagation parameter controls what happens if your code tries to start a nested
transaction.
The propagation policy for @ndb.transactional defaults to ALLOWED.
The propagation policy for ndb.transaction() defaults to NESTED.
The NESTED policy is not
supported by NDB so your code will throw a BadRequestError exception. NDB sets an
unsupported default value, in this case, so that programmers are explicitly aware of the
limitations of nested transactions.
The propagation parameter can be one of the following values:
ndb.TransactionOptions.NESTED
The NESTED propagation policy would commit all changes in the outer and
inner transactions together when the outer policy commits. However, if an exception is thrown
in the inner transaction all changes there would get thrown out but allow the outer
transaction to optionally recover and continue. The NESTED policy is not
supported. If you use this policy, your code will throw a
BadRequestError exception.
ndb.TransactionOptions.MANDATORY
Always propagate an existing transaction; throw an exception
if there is no existing transaction.
If a function that uses this policy throws an exception,
it's probably not safe to catch the exception and commit
the outer transaction; the function may have left the outer
transaction in a bad state.
ndb.TransactionOptions.ALLOWED
If there is an existing transaction, propagate it.
If a function that uses this policy throws an exception,
it's probably not safe to catch the exception and commit
the outer transaction; the function may have left the outer
transaction in a bad state.
ndb.TransactionOptions.INDEPENDENT
Always use a new transaction, "pausing" any existing transactions.
A function that uses this policy should not return any
entities read in the new transaction, as the entities
are not transactionally consistent with the caller's
transaction.
retries
int
How many times to retry automatically in case of transaction failures.
Zero means to try once but not re-try.
In some cases, options are ignored because of caching.
For example, if you specify an RPC deadline for a read
operation that is satisfied from the in-context cache,
the deadline is ignored.
On the other hand,
unrecognized options cause TypeError to be raised.
Operations with different options are grouped together when
auto-batching applies. For example, if you use put_async()
to write some entities with
deadline = 5
and some without specifying a deadline, and all are eligible for
auto-batching, the auto-batcher will make two separate RPC
calls—one for the group of entities with
deadline = 5
and one for the other group—even though the default
RPC deadline is also 5!
This applies even if the option specified is irrelevant to
the RPC operation (for example, ndb_should_cache).
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-03 UTC."],[[["\u003cp\u003eThis page documents the use of legacy bundled services and APIs, which are specifically designed for first-generation runtimes in the App Engine standard environment.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003endb\u003c/code\u003e API provides functions for managing entities, including operations like fetching, deleting, and storing entities, both synchronously and asynchronously.\u003c/p\u003e\n"],["\u003cp\u003eTransactions can be managed through the \u003ccode\u003endb\u003c/code\u003e API, allowing you to run operations in a transactional context, which can be done either directly or using decorators like \u003ccode\u003e@ndb.transactional\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eContext and transaction options are available to configure datastore operations, allowing customization of settings like deadlines, caching behavior, and read policies for individual requests.\u003c/p\u003e\n"],["\u003cp\u003eSpecific exceptions, such as \u003ccode\u003ewebob.exc.HTTPException\u003c/code\u003e and \u003ccode\u003endb.Rollback\u003c/code\u003e, are not logged by default, and users can specify additional exceptions to be excluded from logging via \u003ccode\u003endb.add_flow_exception\u003c/code\u003e.\u003c/p\u003e\n"]]],[],null,["# NDB Functions\n\nFunctions\n---------\n\n| This page describes how to use the legacy bundled services and APIs. This API can only run in first-generation runtimes in the App Engine standard environment. If you are updating to the App Engine Python 3 runtime, refer to the [migration guide](/appengine/migration-center/standard/migrate-to-second-gen/python-differences) to learn about your migration options for legacy bundled services.\n\nndb.add_flow_exception(exc)\n: Specify that an exception should *not* be logged, but is just part of\n normal program flow. (Normally, raising an exception writes a warning\n message to the application's logs.)\n\n **Arguments**\n\n exc\n\n : Exception class that should not be logged. By default, the following exceptions are not logged:\n\n - `webob.exc.HTTPException` (and its subclasses)\n - `ndb.Rollback`\n\nndb.delete_multi(keys, \\*\\*ctx_options)\n\n: Deletes entities identified by the passed sequence of keys. **Arguments**\n\n keys\n : Sequence of [keys](/appengine/docs/legacy/standard/python/ndb/keyclass)\n\n \\*\\*ctx_options\n : [Context options](#context_options)\n\nndb.delete_multi_async(keys, \\*\\*ctx_options)\n\n: Asynchronously deletes entities identified by the passed sequence of keys. **Arguments**\n\n keys\n : Sequence of [keys](/appengine/docs/legacy/standard/python/ndb/keyclass)\n\n \\*\\*ctx_options\n : [Context options](#context_options)\n\n Returns a list of [Future](/appengine/docs/legacy/standard/python/ndb/futureclass)\n objects. Each future's result will be `None`.\n\nndb.get_multi(keys, \\*\\*ctx_options)\n\n: Fetches entities identified by the passed sequence of keys. **Arguments**\n\n keys\n : Sequence of [keys](/appengine/docs/legacy/standard/python/ndb/keyclass)\n\n \\*\\*ctx_options\n : [Context options](#context_options)\n\n Returns a list. Each list item is either a\n [Model](/appengine/docs/legacy/standard/python/ndb/modelclass) instance or `None`\n if the key wasn't found.\n\nndb.get_multi_async(keys, \\*\\*ctx_options)\n\n: Asynchronously fetches entities identified by the passed sequence of keys. **Arguments**\n\n keys\n : Sequence of [keys](/appengine/docs/legacy/standard/python/ndb/keyclass)\n\n \\*\\*ctx_options\n : [Context options](#context_options)\n\n Returns a list of [Future](/appengine/docs/legacy/standard/python/ndb/futureclass)\n objects. Each future's result is a\n [Model](/appengine/docs/legacy/standard/python/ndb/modelclass) instance or `None`\n if the key wasn't found.\n\nndb.in_transaction()\n: Returns a Boolean indicating whether a transaction is currently active.\n\n@ndb.non_transactional \n\n@ndb.non_transactional(allow_existing=True)\n: Decorator to ensure that a function runs *outside* a transaction.\n\n **Arguments:**\n\n allow_existing\n : If `True` (the default) and if the decorated function\n is called by code in a transaction, the function runs independent\n of the transaction. If `False` and if the decorated function\n is called by code in a transaction, it raises an exception.\n\nndb.put_multi(entities, \\*\\*ctx_options)\n: Stores a sequence of [Model](/appengine/docs/legacy/standard/python/ndb/modelclass) instances.\n\n **Arguments**\n\n entities\n : Sequence of [Model](/appengine/docs/legacy/standard/python/ndb/modelclass) instances\n\n \\*\\*ctx_options\n : [Context options](#context_options)\n\n Returns a list with the stored [keys](/appengine/docs/legacy/standard/python/ndb/keyclass).\n\nndb.put_multi_async(entities, \\*\\*ctx_options)\n: Asynchronously stores a sequence of\n [Model](/appengine/docs/legacy/standard/python/ndb/modelclass) instances.\n\n **Arguments**\n\n entities\n : Sequence of [Model](/appengine/docs/legacy/standard/python/ndb/modelclass) instances\n\n \\*\\*ctx_options\n : [Context options](#context_options)\n\n Returns a list of [Future](/appengine/docs/legacy/standard/python/ndb/futureclass)\n objects.\n Each future's result will be a stored [key](/appengine/docs/legacy/standard/python/ndb/keyclass).\n\nndb.transaction(callback, \\*\\*ctx_options)\n\n: Run a callback in a transaction. **Arguments**\n\n callback\n : Function or tasklet to be called\n\n \\*\\*ctx_options\n : [Transaction options](#context_options)\n\n Returns whatever callback returns.\n Raises whatever callback raises or a\n `TransactionFailedError` exception if the transaction fails.\n\n To pass arguments to a callback function, use a lambda. For example, \n\n ```python\n def my_callback(key, inc):\n ...\n\n transaction(lambda: my_callback(Key(...), 1))\n ```\n\nndb.transaction_async(callback, \\*\\*ctx_options)\n\n: Asynchronously run a callback in a transaction. **Arguments**\n\n callback\n : Function or tasklet to be called\n\n \\*\\*ctx_options\n : [Transaction options](#context_options)\n\n Returns a [Future](/appengine/docs/legacy/standard/python/ndb/futureclass).\n The future returns whatever callback returns, or\n raises whatever callback raises or a\n `TransactionFailedError` if the\n transaction fails.\n\n To pass arguments to a callback function, use a lambda. For example, \n\n ```python\n def my_callback(key, inc):\n ...\n\n transaction(lambda: my_callback(Key(...), 1))\n ```\n\n@ndb.transactional \n\n@ndb.transactional(\\*\\*ctx_options)\n\n: Decorator to make a function automatically run in a transaction. **Arguments:**\n\n This decorator can have [transaction options](#context_options).\n\nContext Options, Transaction Options\n------------------------------------\n\nContext options allow you to run specific datastore operations with different\nconfigurations. For example, you might want to vary the read policy\nor the RPC deadline for individual requests.\nYou can do this by passing *context options* to almost any operation.\nSome transaction-related functions take *transaction options*, which include additional options\non top of a set of context options.\n\nHere are a few examples using context options. To set the RPC deadline to 1 second when reading an entity,\nyou can use:\n\n```python\nkey.get(deadline=1)\n```\n\nTo set the memcache timeout to 30 seconds when writing an entity,\nyou can use:\n\n```python\nent.put(ndb_memcache_timeout=30)\n```\n\nTo delete an item that has been cached and force its reload, you can use:\n\n```python\nkey.delete(use_datastore=False)\n```\n\nThe special keyword arguments `options` and `config`\n(which have identical meanings for historical reasons) allow one to specify\nseveral options as a Configuration object. This can be an\n`ndb.ContextOptions` object or\n(for the transactional functions and decorator) an\n`ndb.TransactionOptions` object.\nFor example,\n`key.get(options=ndb.ContextOptions(use_cache=True))`\nis equivalent to\n`key.get(use_cache=True)`.\nThe options set in such an options object can be overridden by\nkeyword parameters.\n\nThe following **context options** are available:\n\nIn some cases, options are ignored because of caching.\nFor example, if you specify an RPC deadline for a read\noperation that is satisfied from the in-context cache,\nthe deadline is ignored.\nOn the other hand,\nunrecognized options cause `TypeError` to be raised.\n\nOperations with different options are grouped together when\nauto-batching applies. For example, if you use `put_async()`\nto write some entities with\n`deadline = 5`\nand some without specifying a deadline, and all are eligible for\nauto-batching, the auto-batcher will make two separate RPC\ncalls---one for the group of entities with\n`deadline = 5`\nand one for the other group---even though the default\nRPC deadline is also 5!\nThis applies even if the option specified is irrelevant to\nthe RPC operation (for example, `ndb_should_cache`)."]]