Russian Qt Forum

Qt => Базы данных => Тема начата: soiam от Май 27, 2013, 12:32



Название: [Решено]различия при работе с mysql и postgresql при создании таблиц
Отправлено: soiam от Май 27, 2013, 12:32
Добрый день. Изначально программа была написана на Qt4 для работы с базой данных mysql. Но теперь появилась необходимость перевести ее на postgresql. Драйвер qpsql подхватился программой нормально, подключение с базой данных устанавливается. Но вот не работает создание таблиц на сервере БД из qt программы(INSERT,SELECT работает)
Код:
        remote_db.setHostName(remote_addr);
        remote_db.setPassword(pass);
        remote_db.setUserName(login);
        remote_db.setDatabaseName("mydb");
        remote_db.setPort(5432);
        remote_db.setConnectOptions("connect_timeout=5;");
        if (remote_db.open())
        {
             remote_query = new QSqlQuery(remote_db);
        //таблица типов помещений
             if (!remote_query -> exec("CREATE TABLE LocationList (loc_number SERIAL, location VARCHAR(50));"))
             {
                   write_log(remote_query -> lastError().text());
             }
        }
При выполнении в лог выводится
Цитировать
ERROR:  syntax error at end of input
LINE 1: EXECUTE
                ^
QPSQL: Unable to create query.
Совсем неинформативная ошибка, в интернете по ней ничего подходящего не нашел. При создании такой таблицы через сторонни клиент БД(например, psql), она создается нормально.
В чем может быть проблема? Заранее благодарен за помощь


Название: Re: различия при работе с mysql и postgresql при создании таблиц
Отправлено: soiam от Май 27, 2013, 15:34
Залез на сервер postgresl в логи. вот, что он выдает
Цитировать
1970-01-01 05:47:27 UTC STATEMENT:  PREPARE qpsqlpstmt_4 AS CREATE TABLE LocationList (loc_number SERIAL, location VARCHAR(50));
1970-01-01 05:47:27 UTC ERROR:  syntax error at end of input at character 9
1970-01-01 05:47:27 UTC STATEMENT:  EXECUTE
1970-01-01 05:47:27 UTC ERROR:  syntax error at or near "CREATE" at character 25
DROP тоже не работает. :( Лог сервера
Цитировать
1970-01-01 05:47:27 UTC STATEMENT:  PREPARE qpsqlpstmt_3 AS drop table locationlist;
1970-01-01 05:47:27 UTC ERROR:  syntax error at end of input at character 9
1970-01-01 05:47:27 UTC STATEMENT:  EXECUTE
1970-01-01 05:47:27 UTC ERROR:  syntax error at or near "CREATE" at character 25


Название: Re: различия при работе с mysql и postgresql при создании таблиц
Отправлено: Serr500 от Май 27, 2013, 15:44
А нет ли в БД функции с именем locationlist?


Название: Re: различия при работе с mysql и postgresql при создании таблиц
Отправлено: soiam от Май 27, 2013, 15:47
у меня таких разных таблиц штук 20. ни одна из ПО не создается, только из сторонних клиентов. Функции пока не использую, вся обработка на стороне клиента


Название: Re: различия при работе с mysql и postgresql при создании таблиц
Отправлено: soiam от Май 27, 2013, 17:56
Вообщем, походу я разобрался. Всё дело в драйвере qpsql для Qt4. Их баг походу.
Когда я через программу формирую "CREATE TABLE LocationList (loc_number SERIAL, location VARCHAR(50));", драйвер Qt4 автоматически добавляет вначале "PREPARE %1 AS ", и посылает на сервер. Когда я вызываю exec(), драйвер посылает на сервер "EXECUTE %1".
Так вот для всяких select,update,insert эти кэшируемые параметризированные запросы(prepared statements) вполне подходят. Но не для create,alter,drop table, так как это единичные неповторяемые statements. Поэтому prepare и не поддерживается с create,drop.
А разработчики qt4 этого не учли... Странно, что это нигде не всплыло до сих пор...


Также не поддерживается создание хранимых процедур походу, вообще обрубок какой-то



Название: Re: различия при работе с mysql и postgresql при создании таблиц
Отправлено: joker от Май 28, 2013, 09:49
Похоже, дело в том, что для многих SQL серверов есть 2 различных понятия:
-DDL (Data Definition Language - язык определения данных)
-DML (Data Manipulation Language - язык манипуляции данными)

При этом первый используется для разработки БД (сюда относятся создания/удаление таблиц/полей, права и т.п.), а второй - для работы с данными (select, insert, update, delete)
Вполне возможно что у мускула эти понятия просто слиты.

Честно говоря, я всегда проектировал БД в отдельных прогах, поэтому не знаю как из Qt но посоветую копать именно в этом направлении.

Хотя нет, еще переспрошу - а вы уверены что создание таблиц "влет" это "хороший" стиль программирования?


Название: Re: различия при работе с mysql и postgresql при создании таблиц
Отправлено: soiam от Май 28, 2013, 10:10
есть случаи, когда это необходимо. Тот же ALTER TABLE, когда программа поменялась, и нужны, допустим дополнительные столбцы. Программное обеспечение же развивается постоянно. Где-то нужно будет ввести новую таблицу для увеличения функционала. В таком случае клиент просто скачивает новую версию, которая дообновляет базу данных сервера. А если это не поддерживает программа, что тогда делать клиенту, чтобы получить дополнительный функционал ПО?


Название: Re: различия при работе с mysql и postgresql при создании таблиц
Отправлено: joker от Май 28, 2013, 14:46
Слушай, а ведь все нормально выполняется.
Есть подозрение что у тебя беда с синтаксисом SQL

Попробуй просто
Цитировать
CREATE TABLE test(id integer);


Название: Re: различия при работе с mysql и postgresql при создании таблиц
Отправлено: soiam от Май 28, 2013, 15:00
Твоя таблица тоже не создается. У меня Qt 4.8.0, 4.7.4 и postgresql 9.1

Подправил драйвер, косяк с созданием и удалением таблиц исчез. Учу драйвер использовать bind параметры новым способом