[odb-users] Creating schema and adding tables without dropping data

Ella Vishnevsky ellav at checkpoint.com
Wed Apr 20 03:52:17 EDT 2016


Hey,

I'm using 2.3.0 version & sqlite
I wanted to implement the following scenario:

1.       Check if sqlite db file exists:

a.       Does not exist :

                                                               i.      Create new file with all tables that have the "db object" pragma.

b.      Exists:

                                                               i.      Add the new tables without erasing data from old tables

I started with the first one, but seems that the file is not being created.
This is the field :      odb::database  *m_db;
Create function:     void Init_OneDB(const std::string &_db_name, long _mode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE);
Implementation:   m_db = new odb::sqlite::database("TEST_ONE_DB",_mode);

Although the file does not exist, an empty file is not being created.


a.       I thought of using schema_catalog::exists(*m_db) but it returns true.

b.      I thought of persisting dummy entity but I get crash :  terminate called after throwing an instance of 'odb::sqlite::database_exception'

  what():  1 (0): no such table: person.

c.       I looked at the example of schema/embedded and creating it by using query on person & creating schema if exception is being caught.
That worked but how can it be implemented when a file exists, but new tables should be inserted.
For example : my sqlite file contains person table. If the sqlite file does not exit - > the query fails -> I reach the catch exception and use the schema_catalog::create_schema.
Now I added a new table : person2. How can I "merge" it? The code will query person->see that it exits -> and won't use create_schema -> person2 will not be added.
On the other hand, if I always use create_schema - I will delete all my data.



       m_db = new odb::sqlite::database("TEST_ONE_DB",_mode);


       //if (odb::schema_catalog::exists(*m_db))
       //{

       //}

       typedef odb::query<CPerson> query;
       typedef odb::result<CPerson> result;

       odb::transaction t (m_db->begin ());

       try
       {
              m_db->query<CPerson> (false);
       }
       catch(const odb::exception& e)
       {
              std::cout << "***** CREATING SCHEMA  ****** " << std::endl;
              schema_catalog::create_schema (*m_db);
       }

       t.commit();


More information about the odb-users mailing list