Russian Qt Forum

Qt => Базы данных => Тема начата: PavelVX от Январь 26, 2011, 06:46



Название: Как подружить linux + Qt + PostgreSQL и разный регистр в названии таблиц?
Отправлено: PavelVX от Январь 26, 2011, 06:46
Подскажите, куда дальше двигаться?
Есть alt linux Postgre server 8.3. Есть линуксовая машинка с Qt 4.7.

Делаем так:
QSqlRelationalTableModel * albumsRelation = new QSqlRelationalTableModel(0);
albumsRelation->setTable("\"Temp\".\"Temp\"");
qDebug() << albumsRelation->lastError(); //говорит следующее: QSqlError(-1, "Unable to find table "Temp"."Temp"", "")

Непонятки. Почитал соседние ветки, возможно это связанно с немного кривоватым драйвером Qt для psql.
В src\sql\drivers\psql\qsql_psql.cpp подправляем на следующее:
static QPSQLDriver::Protocol getPSQLVersion(PGconn* connection)
{
qWarning("My PostgreSQL driver.");
    QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version82;

Дальше все как в инструкции:
#cd /home/pavel/qtsdk-2010.05/qt/src/plugins/sqldrivers/psql/
#/home/pavel/qtsdk-2010.05/qt/bin/qmake -o Makefile "INCLUDEPATH+=/usr/include/pgsql" "LIBS+=-L/usr/lib -lpq" psql.pro
#make
Все делается без ошибок. Запускаем проект. но в окно дебага ничего не падает :(. Разный регистр тоже не срабатывает.
Что теперь делать?
Неужели все кто работают с psql пишут таблицы в нижнем регистре?
PS model->setQuery("select * from \"Temp\".\"Temp\""); //работает


Название: Re: Как подружить linux + Qt + PostgreSQL и разный регистр в названии таблиц?
Отправлено: PavelVX от Январь 26, 2011, 07:11
Если все тоже самое попробочвать сделать через QODBC, то вообще странности начинаются: приложение падает. И пишет:
QODBCDriver::checkHasSQLFetchScroll: Warning - Driver doesn't support scrollable result sets, use forward only mode for queries
*** stack smashing detected ***: /home/pavel_v/test1-build-desktop/test1 terminated
======= Backtrace: =========
куча строк...
В гугле по этому поводу разъяснения не нашел :(. Какой-то мрак.


Название: Re: Как подружить linux + Qt + PostgreSQL и разный регистр в названии таблиц?
Отправлено: prometey от Январь 26, 2011, 12:40
идентификаторы можно писать двумя способами:
1. просто указывать идентификатор
2. указывать его в двойных кавычках. (в мсскл-ле используются вроде квадратные скобки для полей)

В случае 1 постгря автоматом приводит имена идентификаторов в нижний регистр (например оракл - в верхний).
В случае 2 - она не приводит идентификаторы в нижний регистр а использует именно в таком регистре как написано. Драйвер постгри не кривоват, а делает всё вполне закономерно - он дает возможность программисту самому решать как писать идентификаторы - с двойными кавычками или без них. Что касается вопроса "Неужели все кто работают с psql пишут таблицы в нижнем регистре?" - позволю себе ответить уж сильно категорично: все АДЕКВАТНЫЕ люди (по крайней мере то большое количество которое я знаю) программирующие для СУБД пишут идентификаторы в одном регистре и без кавычек, дабы не было путаниц с Temp и temp. Т.о конкретная СУБД приведет их в нужный регистр (постгря - в нижний, оракл - в верхний). Но если уж кто-то решил в силу религиозных причин иметь возможность лицезреть в БД именно Temp, то пусть будет любезен писать "Temp" во всех программах, общающихся с этой таблицей.


Название: Re: Как подружить linux + Qt + PostgreSQL и разный регистр в названии таблиц?
Отправлено: PavelVX от Январь 27, 2011, 06:53
Ну с регистром понятно, что желательно делать все однообразно и просто. Как раз таки "Temp" меня написать-то не напрягает, читать код, лично мне, потом удобнее. Но последующие движения постараюсь делать в ключе: регистр по умолчанию.

По теме топика: мож кому пригодится: снес linux, поставил все с нуля, установил Qt с сайта разрабов из под пользователя и все заработало. Таблицы с разным регистром открываются на ура. Что было, непонятно. Может при установке каких-то обновлений что-то съехало или нехватало прав на выполнение какой-либо операции.

Тему можно закрывать.