Страница 1 из 1

Ошибка с Postgresql

Добавлено: 2012.07.07, 01:53
alu
Есть БД на Постгресе, создал модель и контроллер через gii
таблица на странице Manage отображается, но не работает поиск, Алертом выдает ошибку

Код: Выделить всё

Error 500: <h1>CDbException</h1>
<p>CDbCommand failed to execute the SQL statement: SQLSTATE[42703]: Undefined column: 7 ERROR:  column "country" does not exist
LINE 1: SELECT COUNT(*) FROM "Countries" "t" WHERE Country LIKE '%A%...
                                                   ^. The SQL statement executed was: SELECT COUNT(*) FROM "Countries" "t" WHERE Country LIKE :ycp0 (/xxx/framework/db/CDbCommand.php:528)</p><pre>#0 /xxx/framework/db/CDbCommand.php(425): CDbCommand->queryInternal('fetchColumn', 0, Array)
#1 /xxx/framework/db/ar/CActiveRecord.php(1536): CDbCommand->queryScalar()
Суть ошибки в том, что название поля не заключается в двойные кавычки ("), а для Постгреса это обязательно. Те вместо запроса
SELECT COUNT(*) FROM "Countries" "t" WHERE Country LIKE '%A%...

должен быть запрос
SELECT COUNT(*) FROM "Countries" "t" WHERE "Country" LIKE '%A%...

Что делать и как быть? в интернете решений особо не нашел. :?: :?: :?:

Re: Ошибка с Postgresql

Добавлено: 2012.07.07, 20:58
niklazer
На мой взгляд, самое простой вариант решения - избавиться от необходимости ставить кавычки. Их использование не является обязательным для postgresql (как и для длбой другой СУБД). Дело в том, что IDE (например EMS SQL Manager) для postgresql могут при создании таблиц через визуальный интерфейс формировать DDL с использованием кавычек:
create table "Table" (
"Id" serial primary key,
"Caption" varchar(512)
);
Такой скрипт лучше заменить на следующий:
create table Table1 (
Id serial primary key,
Caption varchar(512)
);
В этом случае при формировании запроса будет неважен регистр именования полей.

Re: Ошибка с Postgresql

Добавлено: 2012.07.09, 06:58
alu
niklazer писал(а):На мой взгляд, самое простой вариант решения - избавиться от необходимости ставить кавычки. Их использование не является обязательным для postgresql (как и для длбой другой СУБД). Дело в том, что IDE (например EMS SQL Manager) для postgresql могут при создании таблиц через визуальный интерфейс формировать DDL с использованием кавычек:
create table "Table" (
"Id" serial primary key,
"Caption" varchar(512)
);
Такой скрипт лучше заменить на следующий:
create table Table1 (
Id serial primary key,
Caption varchar(512)
);
В этом случае при формировании запроса будет неважен регистр именования полей.
Таблицы уже были созданы давно и залезать в их структуру (заноно их создавать) это плохая идея, слишком много данных и завязки там сложные.
Выход вообще есть другой? Просто нужно чтобы все поля и таблицы в запросах поиска и во всех остальных ставились в кавычках, иначе ничего работать не будет

Re: Ошибка с Postgresql

Добавлено: 2012.07.09, 07:50
alu
Может, как-то можно определить список имен полей, как их надо использовать в запросах?

Re: Ошибка с Postgresql

Добавлено: 2012.07.09, 08:53
alu
Причем в самой медели поля rawName Описаны правильно
[Country] => CPgsqlColumnSchema Object
(
[name] => Country
[rawName] => "Country"
Так почему же она их не использует?

Re: Ошибка с Postgresql

Добавлено: 2012.07.09, 11:12
alu
Для поиска проблема снята!
просто в Модели нужно было прописать поля для поиска в кавычках
public function search()
.....
$criteria->compare('"Country"',$this->Country,true);
.....

и вроде поиск работает нормально, дальше посмотрим что где всплывет еще.

Re: Ошибка с Postgresql

Добавлено: 2013.04.02, 12:00
flame
Товарищи, столкнулся с данной проблемой. Запись названия полей таблицы в двойные кавычки в методе search, не исправило ошибку. Какие есть еще варианты решения ошибки для работы с PostgreSQL ?

Re: Ошибка с Postgresql

Добавлено: 2013.05.05, 16:50
diselop
Попробуй так

Код: Выделить всё

$Countries=' "Countries" '
И подставляй переменную в запрос!