Russian Qt Forum

Qt => Базы данных => Тема начата: Keeper13 от Октябрь 30, 2008, 14:11



Название: QSqlTableModel и Postgers
Отправлено: Keeper13 от Октябрь 30, 2008, 14:11
Доброго времени суток.
(QT 4.4.0)
Значит проблема в следующем:
Есть база данных на Постгресе, на соседнем компе. Соеденяюсь.
1. Пробую следующее:
Код:
tbModel = new QSqlQueryModel(this);
tbModel -> setQuery("SELECT * FROM doc_t")
tableView -> setModel(tbModel);
Работает, всё в tableView! То есть всё мы видим, права у юзера на SELECT (и всё остальное) есть.

2. Дальше пробую: изменяю тип модели на QSqlTableModel:
Код:
tbModel = new QSqlTableModel(this);
tbModel -> setTable("doc_t");
tbModel -> setEditStrategy(QSqlTableModel::OnManualSubmit);
tbModel -> select();
tableView -> setModel(tbModel);
Не работает, tableView - ничего не отображает.

3. Дальше дописываю:
Код:
QMessageBox::critical(0, tr("Error: Select failure!"),  tbModel -> lastError().text());
Выдает: Unable to find table doc_t

4. Пробую через: /demos/sqlbrowser.
Подключаюсь, выдает спсиок таблиц.
Двойной-клик по doc_t, и в статусбаре: : Unable to find table doc_t
Так понимаю, что проблема в том же.
То есть QSqlTableModel не видит таблиц, хотя та же QSqlQueryModel эти таблицы видит.
Проблема помоему была уже только с Ораклом, но что это за трабл, так никто и не ответил. тут: (http://www.prog.org.ru/topic_7678_0.html)


Название: Re: QSqlTableModel и Postgers
Отправлено: c00ker от Октябрь 30, 2008, 16:22
попробуй
tbModel -> setTable("DOC_T");


Название: Re: QSqlTableModel и Postgers
Отправлено: panAlexey от Октябрь 30, 2008, 17:43
угу..
у постгреса некоторые вещи регистрозависимы..


Название: Re: QSqlTableModel и Postgers
Отправлено: Keeper13 от Октябрь 30, 2008, 18:19
Цитировать
tbModel -> setTable("DOC_T");
Неа... всё равно.
Только теперь:  Unable to find table DOC_T
Дело не в регистре...


Название: Re: QSqlTableModel и Postgers
Отправлено: developer от Октябрь 30, 2008, 20:01
Попробуй изменить название таблицы, возможно твое название з чем то конфликтует


Название: Re: QSqlTableModel и Postgers
Отправлено: Rcus от Октябрь 30, 2008, 21:46
меня эта тема заинтересовала и я провел небольшое расследование:
первым делом идем в сырцы
..\src\sql\models\qsqltablemodel.cpp :
Код:
    if (d->rec.count() == 0)
        d->error = QSqlError(QLatin1String("Unable to find table ") + d->tableName, QString(),
                             QSqlError::StatementError)
rec это QSqlRecord - описание полей, метод count возвращает количество полей, реализация зависит от драйвера.
Идем в
..\src\sql\drivers\psql\qsql_psql.cpp : 950
Код:
    switch(d->pro) {
    case QPSQLDriver::Version6:
..
    case QPSQLDriver::Version7:
..
и начинаем подозревать неладное (в зависимости от версии меняется текст запроса возвращающего информацию о полях таблицы)
там же строка 670
Код:
        d->pro = getPSQLVersion(d->connection);
чувствую разгадка близко
604 строка и точно,
Код:
    QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version6;
    PGresult* result = PQexec(connection, "select version()");
...
            case 8:
                switch (vMin) {
                case 0:
                    serverVersion = QPSQLDriver::Version8;
                    break;
                case 1:
                    serverVersion = QPSQLDriver::Version81;
                    break;
                case 2:
                    serverVersion = QPSQLDriver::Version82;
                    break;
                }
                break;
            default:
                break;
            }
..
    if (serverVersion < QPSQLDriver::Version73)
        qWarning("This version of PostgreSQL is not supported and may not work.");

дальше чтобы убедиться в гипотезе сверяем версию постгреса (кажется у ОП 8.3 или выше, как и в моем тесте), и лезем в лог, встречаем там интересные строки
Код:
2008-10-30 23:34:05 YEKT STATEMENT:  select pg_attribute.attname, int(pg_attribute.atttypid), pg_attribute.attnotnull, pg_attribute.attlen, pg_attribute.atttypmod, int(pg_attribute.attrelid), pg_attribute.attnum from pg_class, pg_attribute where lower(pg_class.relname) = 't_doc' and pg_attribute.attnum > 0 and pg_attribute.attrelid = pg_class.oid 
2008-10-30 23:34:05 YEKT ERROR:  syntax error at or near "(" at character 28
Надо бы конечно прогнать это все под отладчиком чтобы быть полностью уверенным, но мне что-то лень
//во вставках кода много поскипано, кому надо тот лучше взглянет на оригинал


Название: Re: QSqlTableModel и Postgers
Отправлено: Rcus от Октябрь 30, 2008, 21:57
для тех кому лень читать приведу фрагмент qsql_psql.cpp из 4.5.0-snapshot
Код:
            case 8:
                switch (vMin) {
                case 0:
                    serverVersion = QPSQLDriver::Version8;
                    break;
                case 1:
                    serverVersion = QPSQLDriver::Version81;
                    break;
                case 2:
                default:
                    serverVersion = QPSQLDriver::Version82;
                    break;
                }


Название: Re: QSqlTableModel и Postgers
Отправлено: Keeper13 от Октябрь 31, 2008, 11:29
Да, спасибо.
Сам нашел, исправил просто в методе:
Protocol getPSQLVersion(PGconn* connection)
первую строку на:
QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version82;
То есть по умолчанию беру v.8.2...
Перекомпилил - всё работает.
Согласен что мой драйвер с 6-кой работать не будет. Но думаю мне и не надо.
Залез сюда написать решение, смотрю ты уже всё рассказал (да ищё и правельнее).
Будет время, сделаю по человеческому.
Rcus - молодец!


Название: Re: QSqlTableModel и Postgers
Отправлено: grio от Ноябрь 21, 2009, 06:47
у меня была похожая ситуация с базой SQLITE. часов 5 ковырялся.
оказалось в итоге, что просто создавал модель до коннекта с базой. :)

br,
grio.


Название: Re: QSqlTableModel и Postgers
Отправлено: PavelVX от Январь 24, 2011, 11:19
Не хотелось бы быть некрофильм, но объясните чайнику, что делать-то в таком случае?
У меня так: server: altlinux + PostgreSQL 8.3.5, client 1. (alt linux + qt 4.7)

    QSqlRelationalTableModel * albumsRelation = new QSqlRelationalTableModel(0);
    albumsRelation->setTable("\"Temp\".\"Temp\"");

Данный код не работает. Точнее так: при самом первом запуске, когда только установил все, оно запустилось и выдало результат. С тех пор не хочет :(
И комп перегружал. Не хочет и все :(
qDebug() << albumsRelation->lastError();
говорит следующее: QSqlError(-1, "Unable to find table "Temp"."Temp"", "")
Что делать? Оно же показало один раз, что все правильно.
Если сделать так:
QSqlQueryModel * model = new QSqlQueryModel();
model->setQuery("select * from \"Temp\".\"Temp\"");
то все будет работать.
Если я правильно понял, то нужно пересобрать драйвер.
В qsql_psql.cpp правим:
QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version6;
заменил на
QPSQLDriver::Protocol serverVersion = QPSQLDriver::Version82;
Пересобрал по инструкции. Но все равно не работает. :( Как убедиться, что я правильно собрал драйвер? Или в чем еще может быть проблема?