Название: [Решено]различия при работе с mysql и postgresql при создании таблиц Отправлено: soiam от Май 27, 2013, 12:32 Добрый день. Изначально программа была написана на Qt4 для работы с базой данных mysql. Но теперь появилась необходимость перевести ее на postgresql. Драйвер qpsql подхватился программой нормально, подключение с базой данных устанавливается. Но вот не работает создание таблиц на сервере БД из qt программы(INSERT,SELECT работает)
Код: remote_db.setHostName(remote_addr); Цитировать ERROR: syntax error at end of input Совсем неинформативная ошибка, в интернете по ней ничего подходящего не нашел. При создании такой таблицы через сторонни клиент БД(например, psql), она создается нормально.LINE 1: EXECUTE ^ QPSQL: Unable to create query. В чем может быть проблема? Заранее благодарен за помощь Название: 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)); DROP тоже не работает. :( Лог сервера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 Цитировать 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 параметры новым способом |