Ormantic
The ormantic package is an async ORM for Python, with support for Postgres,
MySQL, and SQLite. Ormatic is a fork from ORM for the purpose of
integrating with FastAPI and is built with:
- SQLAlchemy core for query building.
databasesfor cross-database async support.pydanticfor data validation.
Because ORM is built on SQLAlchemy core, you can use Alembic to provide database migrations.
Note: Use ipython to try this from the console, since it supports await.
import databases
import sqlalchemy
import ormantic as orm
database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()
class Note(orm.Model):
id: orm.Integer(primary_key=True) = None
text: orm.String(max_length=100)
completed: orm.Boolean() = False
class Mapping:
table_name = "notes"
database = database
metadata = metadata
# Create the database
engine = sqlalchemy.create_engine(str(database.url))
metadata.create_all(engine)
# .create()
await Note.objects.create(text="Buy the groceries.", completed=False)
await Note.objects.create(text="Call Mum.", completed=True)
await Note.objects.create(text="Send invoices.", completed=True)
# .all()
notes = await Note.objects.all()
# .filter()
notes = await Note.objects.filter(completed=True).all()
# exact, iexact, contains, icontains, lt, lte, gt, gte, in
notes = await Note.objects.filter(text__icontains="mum").all()
# .get()
note = await Note.objects.get(id=1)
# .update()
await note.update(completed=True)
# .delete()
await note.delete()
note = await Note.objects.get(id=2)
assert note.pk == note.id == 2
Ormantic supports loading and filtering across foreign keys...
import databases
import sqlalchemy
import ormantic as orm
database = databases.Database("sqlite:///db.sqlite")
metadata = sqlalchemy.MetaData()
class Album(orm.Model):
id: orm.Integer(primary_key=True) = None
name: orm.String(max_length=100)
class Mapping:
table_name = "album"
metadata = metadata
database = database
class Track(orm.Model):
id: orm.Integer(primary_key=True) = None
album: orm.ForeignKey(Album)
title: orm.String(max_length=100)
position: orm.Integer()
class Mapping:
table_name = "track"
metadata = metadata
database = database
# Create the database
engine = sqlalchemy.create_engine(str(database.url))
metadata.create_all(engine)
# Create some records to work with.
malibu = await Album.objects.create(name="Malibu")
await Track.objects.create(album=malibu, title="The Bird", position=1)
await Track.objects.create(album=malibu, title="Heart don't stand a chance", position=2)
await Track.objects.create(album=malibu, title="The Waters", position=3)
fantasies = await Album.objects.create(name="Fantasies")
await Track.objects.create(album=fantasies, title="Help I'm Alive", position=1)
await Track.objects.create(album=fantasies, title="Sick Muse", position=2)
# Fetch an instance, without loading a foreign key relationship on it.
track = await Track.objects.get(title="The Bird")
# We have an album instance, but it only has the primary key populated
print(track.album) # Album(id=1) [sparse]
print(track.album.pk) # 1
print(track.album.name) # Raises AttributeError
# Load the relationship from the database
await track.album.load()
assert track.album.name == "Malibu"
# This time, fetch an instance, loading the foreign key relationship.
track = await Track.objects.select_related("album").get(title="The Bird")
assert track.album.name == "Malibu"
# Fetch instances, with a filter across an FK relationship.
tracks = Track.objects.filter(album__name="Fantasies")
assert len(tracks) == 2
# Fetch instances, with a filter and operator across an FK relationship.
assert Track.objects.filter(album__name__iexact="fantasies").count() == 2
Data types
The following keyword arguments are supported on all field types.
primary_keyallow_nullindexunique
The following column types are supported:
orm.Boolean()orm.Date()orm.DateTime()orm.Enum()orm.Float()orm.Integer()orm.JSON()orm.String(max_length)orm.StringArray()orm.Text()orm.Time()
Metadata
Release files for ormantic 0.0.29
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ormantic-0.0.29.tar.gz | 10.3 kB | Without provenance | Details for ormantic-0.0.29.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ormantic-0.0.29-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details for ormantic-0.0.29-py2.py3-none-any.whl |
Total release size: 20.4 kB
Release files / ormantic-0.0.29.tar.gz
| Download URL | ormantic-0.0.29.tar.gz |
|---|---|
| Size | 10.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a7c8a73db029e8d07cfb3cb319c1bc63ee8aa75f743ebfbfa63cce5f1f3b15dd
|
|
BLAKE2b-256 checksum How to use checksums |
cd9a549c7945692131a9af6739ae81a29ba8d1d1fc4a2ddefd7a43d5f33bd16e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.3
|
Release files / ormantic-0.0.29-py2.py3-none-any.whl
| Download URL | ormantic-0.0.29-py2.py3-none-any.whl |
|---|---|
| Size | 10.1 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
4a2888954166b8243a4eda5ba8ea311766e0a19469067e81f4d5c78d1003d71c
|
|
BLAKE2b-256 checksum How to use checksums |
9730ee6afcbf776480cace733b831d372bad4a24a62e71fe62bb00007909681e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.3
|
Security for ormantic 0.0.29
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.