Edgedb DTO is a library that generates DTO pydantic dataclasses from edgeql files.
Project description
Introduction
EdgeDB DTO is a CLI tool for Python that generates pydantic dataclasses for edgeql queries (EdgeDB query language).
Table of Contents
- Python Code
- Features
- Installation
- Example pipeline
- CLI Options
- Dependencies
- Limitations
- Contributors
- License
Python Code
# main.py
from simple.queries.dto import InsertPerson
from edgedb import create_client
CLIENT = create_client()
def insert_three_people():
rob = InsertPerson(name="Rob")
alice = InsertPerson(name="Alice", best_friend=rob)
tom = InsertPerson(name="Tom", best_friend=alice)
tom.run(executor=CLIENT, transaction=True)
insert_three_people()
Features
- Mix and Match multiple Classes: Missed ORMs while using EdgeDB in Python? Look no further! edgedb-dto supports embedding DTOs in each other.
- Easy, intuitive and in 3 steps:
- Write .edgeql queries.
- run
edgedb-py && edgedb-dto
in the terminal - Import generated classes
- Validation using pydantic:
edgedb-dto
generates pydantic dataclasses that you can modify as you wish to validate your input data. - Asynchronous and Synchronous Support: Supports both asynchronous and synchronous database calls.
Installation
To install EdgeDB DTO from PyPI, run:
pip install edgedb-dto
Example Pipeline
Define your database
Project Tree
Schema
We have the following simple schema:
# default.esdl
module default {
type Person{
required name: str{
constraint exclusive;
}
best_friend: Person;
}
}
EdgeQL Query
We also have the following simple .edgeql query:
# insert_person.edgeql
insert Person{
name := $name,
best_friend := $best_friend
} unless conflict on .name else (
select Person filter .name = $name
)
Generate DTO Classes
Let's do some Magic ✨
edgedb-py --no-skip-pydantic --target=blocking && edgedb-dto
PS : To do async calls just remove --target option (run edgedb-py --help
for more context)
New Project Tree
Generated DTO Class
# insert_person_edgeql_dto.py
from ..insert_person_edgeql import InsertPersonResult, insert_person
@dataclass
class InsertPerson(DTO):
name: str
best_friend: DTO | uuid.UUID | None = None
def _query(self, **kwargs):
return insert_person(**kwargs)
def run(self, executor: Client, transaction: bool = False
) -> InsertPersonResult | None:
return self._run(executor, transaction)
Using our DTO Classes
Now let's populate our database with ease:
# main.py
from simple.queries.dto import InsertPerson
from edgedb import create_client
CLIENT = create_client()
def insert_three_people():
rob = InsertPerson(name="Rob")
alice = InsertPerson(name="Alice", best_friend=rob)
tom = InsertPerson(name="Tom", best_friend=alice)
tom.run(executor=CLIENT, transaction=True)
insert_three_people()
By calling run
method on the tom
DTO class, we managed to insert all of our data into the database in a single transaction.
CLI Options
--source-directory
(-s
) [Optional argument]: Source directory containing EdgeQL files.
Default: Edgedb-DTO will scan for the fiels generated by edgedb-py.--output-directory
(-o
) [Optional argument]: Output directory for generated DTO classes.
Default: the files will be generated in a folder nameddto
in the parent folder of the EdgeQL Python files.
Please note that it's better for type safety to not specify theoutput-directory
Dependencies
python
: version=^3.11 is required to run this library.jinja2
: For templating the DTO classes.pydantic
: For data validation and settings management.edgedb
: For interacting with the EdgeDB database.
Limitations
N + 1 Problem
edgedb-dto does not act like a query builder. So the more DTOs you link, the more back and forth calls are made to the database. In the last example, 3 queries to the database are made to complete the transaction.
Contributors
License
This project is licensed under the MIT License - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file edgedb_dto-1.0.2.tar.gz
.
File metadata
- Download URL: edgedb_dto-1.0.2.tar.gz
- Upload date:
- Size: 10.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.11.9 Linux/5.15.154+
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0c3f78b28a511a764347002e3dcca5bd543c751ccc0505b2c5bb11ffd0cd420d |
|
MD5 | 92495ac6f755d16a94e7b093d3afc425 |
|
BLAKE2b-256 | d87e2902b5df7988402f487d0440cf7d8c9d72d3454fdab907ad9d5a8f0c71ea |
File details
Details for the file edgedb_dto-1.0.2-py3-none-any.whl
.
File metadata
- Download URL: edgedb_dto-1.0.2-py3-none-any.whl
- Upload date:
- Size: 11.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.11.9 Linux/5.15.154+
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 74750dc54db7baaaa2d4e4f53c8c8155270d5bad8200ad74a6495b656aa1a497 |
|
MD5 | 746276b2d62c974448c629f2b0193a14 |
|
BLAKE2b-256 | cee22130aa4f28a2202e4e60225a533ba3bdf6616e557ad3c5ccc6e6c455fa00 |