Russian Qt Forum
Ноябрь 22, 2024, 23:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]различия при работе с mysql и postgresql при создании таблиц  (Прочитано 8795 раз)
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), она создается нормально.
В чем может быть проблема? Заранее благодарен за помощь
« Последнее редактирование: Май 29, 2013, 14:30 от soiam » Записан
soiam
Гость
« Ответ #1 : Май 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
Записан
Serr500
Гость
« Ответ #2 : Май 27, 2013, 15:44 »

А нет ли в БД функции с именем locationlist?
Записан
soiam
Гость
« Ответ #3 : Май 27, 2013, 15:47 »

у меня таких разных таблиц штук 20. ни одна из ПО не создается, только из сторонних клиентов. Функции пока не использую, вся обработка на стороне клиента
Записан
soiam
Гость
« Ответ #4 : Май 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 этого не учли... Странно, что это нигде не всплыло до сих пор...


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

« Последнее редактирование: Май 27, 2013, 18:34 от soiam » Записан
joker
Новичок

Offline Offline

Сообщений: 49


Просмотр профиля
« Ответ #5 : Май 28, 2013, 09:49 »

Похоже, дело в том, что для многих SQL серверов есть 2 различных понятия:
-DDL (Data Definition Language - язык определения данных)
-DML (Data Manipulation Language - язык манипуляции данными)

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

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

Хотя нет, еще переспрошу - а вы уверены что создание таблиц "влет" это "хороший" стиль программирования?
Записан
soiam
Гость
« Ответ #6 : Май 28, 2013, 10:10 »

есть случаи, когда это необходимо. Тот же ALTER TABLE, когда программа поменялась, и нужны, допустим дополнительные столбцы. Программное обеспечение же развивается постоянно. Где-то нужно будет ввести новую таблицу для увеличения функционала. В таком случае клиент просто скачивает новую версию, которая дообновляет базу данных сервера. А если это не поддерживает программа, что тогда делать клиенту, чтобы получить дополнительный функционал ПО?
Записан
joker
Новичок

Offline Offline

Сообщений: 49


Просмотр профиля
« Ответ #7 : Май 28, 2013, 14:46 »

Слушай, а ведь все нормально выполняется.
Есть подозрение что у тебя беда с синтаксисом SQL

Попробуй просто
Цитировать
CREATE TABLE test(id integer);
Записан
soiam
Гость
« Ответ #8 : Май 28, 2013, 15:00 »

Твоя таблица тоже не создается. У меня Qt 4.8.0, 4.7.4 и postgresql 9.1

Подправил драйвер, косяк с созданием и удалением таблиц исчез. Учу драйвер использовать bind параметры новым способом
« Последнее редактирование: Май 28, 2013, 15:03 от soiam » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.229 секунд. Запросов: 23.