IMPORTANT NOTICE: WHile the concepts in here still work, with the release of dgraph 1.1 this project is being put aside. There are many changes that are needed to bring it up to date with (for example) enforced 1:1 or 1:many relationships. I am no longer using dgraph and therefore not currently supporting this package. I may come back to it in the future.
PyDiggy
Dgraph to Python object mapper
- Free software: MIT license
Note
Python 3.7 only. Sorry.
EXAMPLE
# ./examples/__init__
from .basic import * # noqa
# ./examples/basic.py
from __future__ import annotations
from pydiggy import Node
from typing import List
class Region(Node):
area: int
population: int
name: str
borders: List[Region]
CLI
Point the CLI utility at an existing module to generate a Dgraph schema.
$ python3 -m pydiggy generate examples Generating schema for: examples Nodes found: (1) - Region Your schema: ~~~~~~~~ Region: bool @index(bool) . _type: string . area: int . borders: uid . name: string . population: int . ~~~~~~~~
GENERATE MUTATIONS
from pydiggy import generate_mutation, Facets
por = Region(uid=0x11, name="Portugal")
spa = Region(uid=0x12, name="Spain")
gas = Region(uid=0x13, name="Gascony")
mar = Region(uid=0x14, name="Marseilles")
por.borders = [spa]
spa.borders = [por, gas, mar]
gas.borders = [Facets(spa, foo='bar', hello='world'), mar]
mar.borders = [spa, gas]
por.stage()
spa.stage()
gas.stage()
mar.stage()
print(generate_mutation())
The result:
{ set { <0x11> <Region> "true" . <0x11> <_type> "Region" . <0x11> <name> "Portugal" . <0x11> <borders> <0x12> . <0x12> <Region> "true" . <0x12> <_type> "Region" . <0x12> <name> "Spain" . <0x12> <borders> <0x11> . <0x12> <borders> <0x13> . <0x12> <borders> <0x14> . <0x13> <Region> "true" . <0x13> <_type> "Region" . <0x13> <name> "Gascony" . <0x13> <borders> <0x12> (foo="bar", hello="world") . <0x13> <borders> <0x14> . <0x14> <Region> "true" . <0x14> <_type> "Region" . <0x14> <name> "Marseilles" . <0x14> <borders> <0x12> . <0x14> <borders> <0x13> . } }
HYDRATE FROM JSON TO PYTHON OBJECTS
Given some response from Dgraph:
{
"data": {
"allRegions": [
{
"uid": "0x11",
"_type": "Region",
"name": "Portugal",
"borders": [
{
"uid": "0x12",
"_type": "Region",
"name": "Spain"
}
]
},
{
"uid": "0x12",
"_type": "Region",
"name": "Spain",
"borders": [
{
"uid": "0x11",
"_type": "Region",
"name": "Portugal"
},
{
"uid": "0x13",
"_type": "Region",
"name": "Gascony"
},
{
"uid": "0x14",
"_type": "Region",
"name": "Marseilles"
}
]
},
{
"uid": "0x13",
"_type": "Region",
"name": "Gascony",
"borders": [
{
"uid": "0x12",
"_type": "Region",
"name": "Spain",
"borders|foo": "bar",
"borders|hello": "world"
},
{
"uid": "0x14",
"_type": "Region",
"name": "Marseilles"
}
]
},
{
"uid": "0x14",
"_type": "Region",
"name": "Marseilles",
"borders": [
{
"uid": "0x12",
"_type": "Region",
"name": "Spain"
},
{
"uid": "0x13",
"_type": "Region",
"name": "Gascony"
}
]
}
]
},
"extensions": {
"server_latency": {
"parsing_ns": 23727,
"processing_ns": 2000535,
"encoding_ns": 7803450
},
"txn": {
"start_ts": 117,
"lin_read": {
"ids": {
"1": 49
}
}
}
}
}
We can turn it into some Python objects:
>>> data = hydrate(retrieved_data)
{'allRegions': [<Region:17>, <Region:18>, <Region:19>, <Region:20>]}