Managing the schema
Creating tables from models
Use create_table() to create the table associated to a model or mapper.
from sqlorm import create_table
class Task:
id: PrimaryKey[int]
title: str
done: bool
with engine:
create_table(Task)
Use create_all() to create all tables for models in a registry. If no registry is provided, Model.__model_registry__ is used.
from sqlorm import create_all
class Task(Model):
id: PrimaryKey[int]
title: str
done: bool
with engine:
create_all()
You can check if a table exists first and prevent executing create table statements for existing tables using check_missing=True.
Tip
If you have bound your models to an engine, pass the model registry to create_all():
Model = Model.bind(engine)
# ... define models
with engine:
create_all(Model.__model_registry__)
Migrations
sqlorm includes a simple one-way migration system. It will execute a list of sql or python files in order.
Create a migrations folder with .sql or .py files prefixed with a version number (1 or more number) followed by an underscore and a name.
migrations/
000_init.sql
001_add_indexes.sql
002_seed_data.py
Use migrate() to execute these files in order. If no errors are raised during the run, the latest version is saved in a schema_version table in the database.
It will be used as starting point for the next time you run migrate() (unless use_schema_version=False is used).
from sqlorm import migrate
with engine:
migrate()
Tip
The transactions folder is resolved relative to the working directory. Provide an alternative path as first argument to migrate().
SQL files can contain multiple statements.
In python files, use ensure_transaction() to create a transaction context:
# 002_seed_data.py
from sqlorm import ensure_transaction
with ensure_transaction() as tx:
tx.execute("...")
Initializing the database
Use init_db() to quickly initialize a database, either using create_all(check_missing=True) if no migrations exist or migrating the schema to the latest version.
from sqlorm import init_db
with engine:
init_db()