Simple ORM based on Pydantic and SQLite with minimalistic API
Project description
ORMagic - Simple ORM for Python
The main goal of ORMagic is to provide a simple and easy-to-use ORM for Python, that is easy to understand and use, while still providing the necessary features to interact with a database. The library is in the early stages of development, so it is not recommended to use it in production. Is based on the Pydantic model and extends it with the ability to save, read, update and delete data from a SQLite database.
Installation
pip install ORMagic
Usage
Define a model
To define a model, create a class that inherits from DBModel
and define the fields using Pydantic's field types.
from ormagic import DBModel
class User(DBModel):
name: str
age: int
# Create the table in the database
User.create_table()
Save, read, update and delete data
# Save data to the database, this will create a new record or update an existing one if the primary key is already present
user = User(name="John", age=30)
user.save()
# Read data from the database
user = User.get(id=1)
print(user)
>>> User(id=1, name='John', age=30)
# Read all data from the database
users = User.all()
print(users)
>>> [User(id=1, name='John', age=30), User(id=2, name='Alice', age=25), ...]
# Delete data from the database
user.delete()
# Update data
user = User.get(id=1)
user.age = 31
user.save()
# Filter data and retrieve multiple records
users = User.filter(age=31)
print(users)
>>> [User(id=1, name='John', age=31), User(id=2, name='Alice', age=31), ...]
Define foreign keys
To define a foreign key, use other models as fields in the model.
By default, the foreign key will be set to CASCADE
, but you can change it by setting the on_delete
parameter of the pydantic field to one of the following values: CASCADE
, SET NULL
, RESTRICT
, SET DEFAULT
, NO ACTION
.
from ormagic import DBModel
class User(DBModel):
name: str
class Post(DBModel):
title: str
content: str
user: User # Define a foreign key with default on_delete=CASCADE
User.create_table()
Post.create_table()
user = User(name="John")
user.save()
Post(title="Hello", content="World", user=user).save()
# You can also save child models with new parent object in one step, this will save the parent object first and then the child object
Post(title="Hello", content="World", user=User(name="Alice")).save()
Define foreign key with custom on_delete
from ormagic import DBModel
from pydantic import Field
class User(DBModel):
name: str
class Post(DBModel):
title: str
content: str
user: User = Field(on_delete="CASCADE")
user: User = Field(on_delete="RESTRICT")
user: User = Field(on_delete="NO ACTION")
user: User = Field(on_delete="SET DEFAULT", default=1)
user: User = Field(on_delete="SET NULL", default=None)
User.create_table()
Post.create_table()
Unique constraints
To define a unique constraint, use the unique
parameter set to True
in the Pydantic field.
from ormagic import DBModel
from pydantic import Field
class User(DBModel):
name: str
email: str = Field(unique=True)
You can also use the unique
parameter to define one to one relationships between tables.
from ormagic import DBModel
from pydantic import Field
class User(DBModel):
name: str
class UserProfile(DBModel):
user: User = Field(unique=True)
bio: str
Deleting and updating tables
To delete a table, use the drop_table
method.
User.drop_table()
To update a table, use the update_table
method. (Not implemented yet)
User.update_table()
Integration with FastAPI
Because ORMagic is based on Pydantic, it can be easily integrated with FastAPI. Below is an example of how to use ORMagic with FastAPI to create a simple CRUD REST API.
from fastapi import FastAPI
from ormagic import DBModel
app = FastAPI()
class User(DBModel):
name: str
age: int
User.create_table()
@app.post("/users/")
def create_user(user: User):
return user.save()
@app.get("/users/")
def read_users():
return User.all()
@app.get("/users/{id}")
def read_user(id: int):
return User.get(id=id)
@app.put("/users/{id}")
def update_user(id: int, user: User):
user.id = id
return user.save()
@app.delete("/users/{id}")
def delete_user(id: int):
User.get(id=id).delete()
return {"message": "User deleted"}
Features and Roadmap
- Define table schema using Pydantic models
- Basic CRUD operations
- Save data to the database
- Read data from the database
- Update data in the database
- Delete data from the database
- Relationships between tables
- One-to-many
- Create a tables with a foreign key
- Save data with a foreign key
- Read data with a foreign key
- Update data with a foreign key
- Delete data with a foreign key
- Cascade
- Set null
- Restrict
- Set default
- No action
- One-to-one
- Many-to-many
- One-to-many
- Unique constraints
- Remove table
- Filter data and retrieve multiple records
- Read all data from the database
- Update table schema
- Custom primary key
- Bulk operations (save, update, delete)
- Migrations
License
This project is licensed under the terms of the MIT license
Contributing
Contributions are welcome! Feel free to open an issue or submit a pull request.
Why?
There are many ORMs for Python, but most of them are too complex or have too many features that are not needed for simple projects.
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 ormagic-0.5.0.tar.gz
.
File metadata
- Download URL: ormagic-0.5.0.tar.gz
- Upload date:
- Size: 5.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.4 Linux/6.5.0-1024-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7ae2b598df70b7b61e1bacd657d79f23cda3c00ee0c6fae8682f3ac9938eb6f8 |
|
MD5 | cdae44c923e471801500a44290431613 |
|
BLAKE2b-256 | 965c774cd2af7cc3507da42d6a717c8e08d3947a2f4fda68ca63710e01e91915 |
File details
Details for the file ormagic-0.5.0-py3-none-any.whl
.
File metadata
- Download URL: ormagic-0.5.0-py3-none-any.whl
- Upload date:
- Size: 6.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.4 Linux/6.5.0-1024-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | fcdba080cb0590b3c561e089c89159206d46106a6d448d76d6525dd21fda2b68 |
|
MD5 | 9c7300a3fdeadd36cac7a20fa4a1f1ac |
|
BLAKE2b-256 | 8c7a48001d516463bc1439bbb535b36cd43797aa2b1afc5463b88ee1362acf0c |