Russian Qt Forum

Qt => Базы данных => Тема начата: pichini от Декабрь 13, 2010, 15:41



Название: Проблема с переносом данных из in-memory базы в файл (SQLite)
Отправлено: pichini от Декабрь 13, 2010, 15:41
Всем привет!

Собственно, создаю две базы, для каждой из них свой query. Делаю к одной из них "attach database ..."
Если обе базы не в памяти, то все ок, если же первую создаю как :memory: не могу перенести из нее данные,
при выполнении запроса тест ошибки:  "no such table: table1".

Код
C++ (Qt)
   QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "test1");
   //db1.setDatabaseName("test1.db3");
   db1.setDatabaseName(":memory:");
   if (!db1.open()) {
       qDebug() << "Cannot open database:" << db1.lastError();
       return false;
   }
   QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE", "test2");
   db2.setDatabaseName("test2.db3"); //db.setDatabaseName(":memory:");
   if (!db2.open()) {
       qDebug() << "Cannot open database:" << db2.lastError();
       return false;
   }
 
   QSqlQuery query1(db1);
   QSqlQuery query2(db2);
 
   QString   str  = "CREATE TABLE table1 ( "
                        "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
                        "name   VARCHAR(150) NOT NULL "
                    ");";
   if (!query1.exec(str))
   {
       qDebug() << "Unable to create table1" << query1.lastError().text();
   }
   else
   {
       QString strF = "INSERT INTO  table1 (name) "
                      "VALUES('%1');";
       if (!query1.exec(strF.arg("qqq")))
       {
           qDebug() << "Unable to insert data to table1" << query1.lastError().text();
       }
       if (!query1.exec(strF.arg("www")))
       {
           qDebug() << "Unable to insert data to table1" << query1.lastError().text();
       }
   }    
   str  = "CREATE TABLE table2 ( "
                        "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
                        "name   VARCHAR(150) NOT NULL "
                    ");";
   if (!query2.exec(str))
   {
       qDebug() << "Unable to create table2" << query2.lastError().text();
   }
 
   str  = "ATTACH DATABASE ':memory:' AS test1";
   if (!query2.exec(str))
   {
       qDebug() << "Unable to attach database" << query2.lastError().text();
   }
 
   str  = "INSERT INTO  table2 (name) SELECT table1.name from table1";
   if (!query2.exec(str))
   {
       qDebug() << "Unable to insert data to table2" << query2.lastError().text();
   }
   else
       qDebug() << "ok";
 


Название: Re: Проблема с переносом данных из in-memory базы в файл (SQLite)
Отправлено: pichini от Декабрь 14, 2010, 11:00
Вообщем, в случае если делать attach физической базы к in-memory и выполнять insert со стороны in-memory то все ок.
Хз почему...

Код
C++ (Qt)
  str  = "ATTACH DATABASE 'test2.db3' AS test2";
   if (!query1.exec(str))
   {
       qDebug() << "Unable to attach database" << query1.lastError().text();
   }
 
   str  = "INSERT INTO table2 (name) SELECT table1.name FROM table1";
   if (!query1.exec(str))
   {
       qDebug() << "Unable to insert data to table2" << query1.lastError().text();
   }
   else
       qDebug() << "ok";