Schema Migrations

Datalite provides a module, aiodatalite.migrations that handles schema migrations. When a class definition is modified, aiodatalite.migrations.migrate can be called to transfer records to a table fitting the new definitions.

Let us say we have made changes to the fields of a dataclass called Student and now, we want these changes to be made to the database. More specifically, we had a field called studentt_id and realised this was a typo, we want it to be named into student_id, and we want the values that was previously hold in this column to be persistent despite the name change. We can achieve this easily by:

await migrate(Student, {'studentt_id': 'student_id'})

This will make all the changes, if we had not provided the second argument, the values would be lost.

Also, migrate provides automatic backup before migration, you can turn it off by passing do_backup=False into function.

We also introduce safe migration defaults. This parameter should be passed a key-value dictionary, where the key is the name of the new required field, and the value is what should be written to the old records in the database.

from aiodatalite import datalite
from aiodatalite.typed import DataliteHinted
@datalite(db_path='db.db')
@dataclass
class Student(DataliteHinted):
    new_obligatory_field: str  # the database will break if not all records have this field
    student_id: int = 1
    student_name: str = "Kurt Gödel"
    student_gpa: float = 3.9

So in this situation basically what you need to do is:

await migrate(Student, safe_migration_defaults={
        "new_obligatory_field": "some value for records that already exist in the database"
    }
)