Skip to content

Distinguish sync_schema_result::dropped_and_recreated with and without backup #1462

@HansH

Description

@HansH

See this example:

#include <iostream>
#include <sqlite_orm/sqlite_orm.h>
#include <string>

using namespace sqlite_orm;

struct MyTableRecord {
    int id = 0;
    std::string name;
};

int main() {
    {
        auto storage = make_storage("db.sqlite",
            make_table("MyTable",
               make_column("id", &MyTableRecord::id)));
        storage.sync_schema(true);
        storage.insert(MyTableRecord{1, ""});
        storage.insert(MyTableRecord{2, ""});
    }
    {
        std::cout << "When adding a primary key:\n";
        auto storage = make_storage("db.sqlite",
            make_table("MyTable",
               make_column("id", &MyTableRecord::id, primary_key())));
        for (auto& [tableName, result] : storage.sync_schema(true)) {
            std::cout << tableName << ": " << result << std::endl;
        }
        auto allRecords = storage.get_all<MyTableRecord>();
        for (auto& record : storage.get_all<MyTableRecord>()) {
            std::cout << record.id <<std::endl;
        }
    }
    {
        std::cout << "When adding a non-null column without default value:\n";
        auto storage = make_storage("db.sqlite",
            make_table("MyTable",
               make_column("id", &MyTableRecord::id, primary_key()),
               make_column("name", &MyTableRecord::name)));
        for (auto& [tableName, result] : storage.sync_schema(true)) {
            std::cout << tableName << ": " << result << std::endl;
        }
        for (auto& record : storage.iterate<MyTableRecord>()) {
            std::cout << record.id <<std::endl;
        }
    }

    return 0;
}

This outputs:

When adding a primary key:
MyTable: old table dropped and recreated
1
2
When adding a non-null column without default value:
MyTable: old table dropped and recreated

Note that in both cases sync_schema returns sync_schema_result::dropped_and_recreated for MyTable. In the first case the table is backed up and we don't lose data. But in the second case the data is lost.

sync_schema_simulate returns the same. We would like to be able to use sync_schema_simulate to ensure that we don't lose data when the database scheme is updated. But if both cases return the same, that is not possible. Am I missing something?

I think it would make sense if the sync_schema_result enum had two different options for these two cases. But that would break the API of the library, so I'm not sure if that is a change you are willing to make.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions