All posts

修复 ThinkPHP5 使用 PostgreSQL 12+ 高版本报错

ThinkPHP 使用 PostgreSQL 需要导入一个 pgsql.sql ,然而在PostgreSQL 12版本以后,pg_attrdef.adsrc 被移除了,因此会报错 将 pgsql.sql 中的 pg_attrdef.adsrc 1 替换为 pg_get_exprpg_attrdef.adb

ThinkPHP 使用 PostgreSQL 需要导入一个 pgsql.sql ,然而在PostgreSQL 12版本以后,pg_attrdef.adsrc 被移除了,因此会报错

将 pgsql.sql 中的

pg_attrdef.adsrc

1

替换为

pggetexpr(pgattrdef.adbin, pgattribute.attrelid)

1

然后重新运行一次SQL即可

附:替换完成后的pgsql.sql内容

CREATE OR REPLACE FUNCTION "public"."tablemsg" (aschemaname varchar, atable_name varchar) RETURNS SETOF "public"."tablestruct" AS

$body$

DECLARE

v_ret tablestruct;

v_oid oid;

v_sql varchar;

v_rec RECORD;

v_key varchar;

BEGIN

SELECT

pgclass.oid INTO void

FROM

pg_class

INNER JOIN pgnamespace ON (pgclass.relnamespace = pgnamespace.oid AND lower(pgnamespace.nspname) = aschemaname)

WHERE

pgclass.relname=atable_name;

IF NOT FOUND THEN

RETURN;

END IF;

v_sql='

SELECT

pgattribute.attname AS fieldsname,

pgattribute.attnum AS fieldsindex,

pgsqltype(pgtype.typname::varchar) AS fields_type,

pgattribute.atttypmod-4 as fieldslength,

CASE WHEN pg_attribute.attnotnull THEN ''not null''

ELSE ''''

END AS fieldsnotnull,

pggetexpr(pgattrdef.adbin, pgattribute.attrelid) AS fields_default,

pgdescription.description AS fieldscomment

FROM

pg_attribute

INNER JOIN pgclass ON pgattribute.attrelid = pg_class.oid

INNER JOIN pgtype ON pgattribute.atttypid = pg_type.oid

LEFT OUTER JOIN pgattrdef ON pgattrdef.adrelid = pgclass.oid AND pgattrdef.adnum = pg_attribute.attnum

LEFT OUTER JOIN pgdescription ON pgdescription.objoid = pgclass.oid AND pgdescription.objsubid = pg_attribute.attnum

WHERE

pg_attribute.attnum > 0

AND attisdropped <> ''t''

AND pgclass.oid = ' || void || '

ORDER BY pg_attribute.attnum' ;

FOR vrec IN EXECUTE vsql LOOP

vret.fieldsname=vrec.fieldsname;

vret.fieldstype=vrec.fieldstype;

IF vrec.fieldslength > 0 THEN

vret.fieldslength:=vrec.fieldslength;

ELSE

vret.fieldslength:=NULL;

END IF;

vret.fieldsnotnull=vrec.fieldsnotnull;

vret.fieldsdefault=vrec.fieldsdefault;

vret.fieldscomment=vrec.fieldscomment;

SELECT constraintname INTO vkey FROM informationschema.keycolumnusage WHERE tableschema=aschemaname AND tablename=atablename AND columnname=vrec.fieldsname;

IF FOUND THEN

vret.fieldskeyname=vkey;

ELSE

vret.fieldskey_name='';

END IF;

RETURN NEXT v_ret;

END LOOP;

RETURN ;

END;

$body$

LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

COMMENT ON FUNCTION "public"."tablemsg"(aschemaname varchar, atable_name varchar)

IS '获得表信息';

\---重载一个函数

CREATE OR REPLACE FUNCTION "public"."tablemsg" (atable_name varchar) RETURNS SETOF "public"."tablestruct" AS

$body$

DECLARE

v_ret tablestruct;

BEGIN

FOR vret IN SELECT * FROM tablemsg('public',atablename) LOOP

RETURN NEXT v_ret;

END LOOP;

RETURN;

END;

$body$

LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

COMMENT ON FUNCTION "public"."tablemsg"(atable_name varchar)

IS '获得表信息';

Discussion

No comments yet