aiodatastore
aiodatastore is a low level and high performance asyncio client for Google Datastore REST API. Inspired by gcloud-aio library, thanks!
Key advantages:
-
lazy properties loading (that's why it's fast, mostly)
-
explicit value types for properties (no types guessing)
-
strictly following Google Datastore REST API data structures
Installation
pip install aiodatastore
How to create datastore client
from aiodatastore import Datastore
client = Datastore("project1", service_file="/path/to/file")
You can also set namespace if needed:
from aiodatastore import Datastore
client = Datastore("project1", service_file="/path/to/file", namespace="namespace1")
To use Datastore emulator (for tests or development), just define DATASTORE_EMULATOR_HOST environment variable (usually value is 127.0.0.1:8081).
How to work with keys and entities
from aiodatastore import Key, PartitionId, PathElement
key = Key(PartitionId("project1"), [PathElement("Kind1")])
You can also set namespace for key:
from aiodatastore import Key, PartitionId, PathElement
key = Key(PartitionId("project1", namespace_id="namespace1"), [PathElement("Kind1")])
And id or name for path element:
from aiodatastore import Key, PartitionId, PathElement
key1 = Key(PartitionId("project1"), [PathElement("Kind1", id="12345")])
key2 = Key(PartitionId("project1"), [PathElement("Kind1", name="name1")])
To create an entity object, you have to specify key and properties. Properties is a dict with string keys and typed values. For each data type the library provides corresponding value class. Every value (except ArrayValue) can be indexed or not (indexed by default):
from aiodatastore import Entity, Key, PartitionId, PathElement
from aiodatastore import (
ArrayValue,
BoleanValue,
BlobValue,
DoubleValue,
GeoPointValue,
IntegerValue,
LatLng,
NullValue,
StringValue,
TimestampValue,
)
key = Key(PartitionId("project1"), [PathElement("Kind1")])
entity = Entity(key, properties={
"array-prop": ArrayValue([NullValue(), IntegerValue(123), StringValue("str1")]),
"bool-prop": BooleanValue(True),
"blob-prop": BlobValue("data to store as blob"),
"double-prop": DoubleValue(1.23, indexed=False),
"geo-prop": GeoPointValue(LatLng(1.23, 4.56)),
"integer-prop": IntegerValue(123),
"null-prop": NullValue(),
"string-prop": StringValue("str1"),
"timestamp-prop": TimestampValue(datetime.datetime.utcnow()),
})
To access property value use .value attribute:
print(entity.properties["integer-prop"].value)
123
Use .value attribute to change property value and keep index status. Or assign new value and set index:
print(entity.properties["integer-prop"].value, entity.properties["integer-prop"].indexed)
123, True
entity.properties["integer-prop"].value = 456
print(entity.properties["integer-prop"].value, entity.properties["integer-prop"].indexed)
456, True
entity.properties["integer-prop"] = IntegerValue(456, indexed=True)
print(entity.properties["integer-prop"].value, entity.properties["integer-prop"].indexed)
456, True
Use .indexed attribute to access or change index:
print(entity.properties["integer-prop"].indexed)
True
entity.properties["integer-prop"].indexed = False
print(entity.properties["integer-prop"].indexed)
False
To insert new entity (the entity key's final path element may be incomplete):
key = Key(PartitionId("project1"), [PathElement("Kind1")])
entity = Entity(key, properties={
"string-prop": StringValue("some value"),
})
await client.insert(entity)
To update an entity (the entity must already exist. Must have a complete key path):
entity.properties["string-prop"] = StringValue("new value")
await client.update(entity)
To upsert an entity (the entity may or may not already exist. The entity key's final path element may be incomplete):
key = Key(PartitionId("project1"), [PathElement("Kind1")])
entity = Entity(key, properties={
"string-prop": StringValue("some value"),
})
await client.upsert(entity)
To delete an entity (the entity may or may not already exist. Must have a complete key path and must not be reserved/read-only):
await client.delete(entity)
If you have entity's key or know how to build it:
await client.delete(key)
Release files for aiodatastore 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aiodatastore-0.2.0.tar.gz | 20.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aiodatastore-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.9 kB
Release files / aiodatastore-0.2.0.tar.gz
| Download URL | aiodatastore-0.2.0.tar.gz |
|---|---|
| Size | 20.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bbe38621da1e3023d1a7ccefc3685340acbb10c65176cbdc3c20bfefc0e9b484
|
|
BLAKE2b-256 checksum How to use checksums |
4bad47578b2dec75a4f488464d74522658f43739955176d31312d6d9aad890d2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.6
|
Release files / aiodatastore-0.2.0-py3-none-any.whl
| Download URL | aiodatastore-0.2.0-py3-none-any.whl |
|---|---|
| Size | 16.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4b3f84b5fee2b218b1c47778b11f1f2df3c60ec14faffdb4143d2b6661d44bc5
|
|
BLAKE2b-256 checksum How to use checksums |
01eb8d43ac1ac01365d4d0764d7d9f77d57392960f4e831aa62ac4b364ca2048
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.6
|