PostgreSQL: неопределенная функция array_agg (enumlabel)

1

Я новичок в PostgreSQL. Когда я применяю миграцию на хостинге, я вижу ошибку:

SQLSTATE[42883]: Undefined function: 7
ERROR: function array_agg(name) does not exist
LINE 12: array_to_string((select array_agg(enumlabel) from pg_enum...

Мой хостинг имеет PostgreSQL 8.3.11.

Выполняется SQL:

SELECT
    d.nspname AS table_schema,
    c.relname AS table_name,
    a.attname AS column_name,
    t.typname AS data_type,
    a.attlen AS character_maximum_length,
    pg_catalog.col_description(c.oid, a.attnum) AS column_comment,
    a.atttypmod AS modifier,
    a.attnotnull = false AS is_nullable,
CAST(pg_get_expr(ad.adbin, ad.adrelid) AS varchar) AS column_default,
coalesce(pg_get_expr(ad.adbin, ad.adrelid) ~ 'nextval',false) AS is_autoinc,

array_to_string((select array_agg(enumlabel)
from pg_enum
where enumtypid=a.atttypid)::varchar[],',') as enum_values,

CASE atttypid
    WHEN 21 /*int2*/ THEN 16
    WHEN 23 /*int4*/ THEN 32
    WHEN 20 /*int8*/ THEN 64
    WHEN 1700 /*numeric*/ THEN
CASE WHEN atttypmod = -1
THEN null
ELSE ((atttypmod - 4) >> 16) & 65535
END
    WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/
    WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/
ELSE null
END AS numeric_precision,
CASE
    WHEN atttypid IN (21, 23, 20) THEN 0
    WHEN atttypid IN (1700) THEN
CASE
    WHEN atttypmod = -1 THEN null
ELSE (atttypmod - 4) & 65535
END
ELSE null
END AS numeric_scale,
CAST(information_schema._pg_char_max_length(information_schema._pg_truetypid(a, t),
information_schema._pg_truetypmod(a, t)) AS numeric) AS size,
a.attnum = any (ct.conkey) as is_pkey
FROM
pg_class c
    LEFT JOIN pg_attribute a ON a.attrelid = c.oid
    LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum
    LEFT JOIN pg_type t ON a.atttypid = t.oid
    LEFT JOIN pg_namespace d ON d.oid = c.relnamespace
    LEFT join pg_constraint ct on ct.conrelid=c.oid and ct.contype='p'
WHERE
    a.attnum > 0 and t.typname != ''
    and c.relname = 'migration'
    and d.nspname = 'public'
ORDER BY
    a.attnum;

в .../vendor/yiisoft/yii2/db/Schema.php:628

  • 0
    stackoverflow.com/a/20156444/3599237
  • 3
    Прежде чем делать что-либо еще, рассмотрите страницу версий Postgres . Postgres 8.3 достиг EOL в 2013 году и не поддерживается и слишком стар для любой серьезной работы. Обновление до текущей версии.
Теги:
arrays
yii2

3 ответа

5

Как и комментарий, ваш лучший вариант - обновить текущую версию Postgres. В Postgres 8.3 нет функции array_agg().

Однако вы можете заменить базовым конструктором ARRAY, который был там, по крайней мере, с Postgres 7.4 и, как оказалось, для этого эффективнее, даже в текущих Postgres. Замените выделенную часть запроса в своем вопросе с помощью:

array_to_string(ARRAY(
   SELECT enumlabel FROM pg_enum
   WHERE  enumtypid = a.atttypid)::text[], ',') AS enum_values,

В Postgres 9.0 или новее вы можете упростить с помощью string_agg():

(SELECT string_agg(enumlabel, ',') FROM pg_enum
 WHERE  enumtypid = a.atttypid) AS enum_values,

Однако простой конструктор ARRAY должен быть быстрее.
BTW, сам pg_enum был введен с Postgres 8.3 (для типов enum).

1

Там нет array_agg в Postgresql 8.3.

Но если вы просто не обновляете, вы можете просто создать функцию array_agg так же просто, как это:

CREATE AGGREGATE array_agg (
    sfunc = array_append,
    basetype = anyelement,
    stype = anyarray,
    initcond = '{}'
);

НЕ ПРЯМО СООТВЕТСТВУЕТ ВОПРОСУ:

Если вы решите перейти с версии 8.x на 9.x, некоторые (плохо написанные) запросы больше не будут работать... особенно те, у которых есть неявные приведения:

select * from my_table where my_int_column = some_text_value

Итак, вы должны переписать их, добавив явное действие:

select * from my_table where my_int_column = some_text_value::int

или вы можете создать несколько "автозаказов", чтобы они работали, пока вы их переписываете:

CREATE CAST (varchar AS integer) WITH INOUT AS IMPLICIT;
CREATE CAST (character AS integer) WITH INOUT AS IMPLICIT;
1

В PostgreSQL 8.3 нет функции array_agg. См. Примечания к выпуску.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню