sql错误42601_pgsql的数据库字典导出,报错syntax error at or near 错误码为42601

5f503b424666f1cb9f29762aed3ae5ba.png

今天在导出pgsql数据库字典时,运行sql出现很奇怪的问题,报错内容如下:

SQL 错误 [42601]: ERROR: syntax error at or near "select "
位置:1

94206c74fce25909c240353ed55de824.png

sql语句如下:

select
a."数据库名" as 数据库名,
a."表名" as 表名,
a."表中文描述" as 表中文描述,
b.typname as 表类型,
'' as 表创建时间,
a."字段编号" as 字段编号,
a."字段名" as 字段名,
a."字段描述" as 字段描述,
a."字段类型" as 字段类型,
a."数据长度" as 数据长度,
d.adrename as 默认值,
a."是否为空字段" as 是否为空字段,
c.indexrelid as 是否索引字段,
a."是否分区字段" as 是否分区字段
from (select
pg_namespace.nspname as 数据库名,
pg_class.relname as 表名,
cast(obj_description(pg_class.relfilenode,'pg_class') as varchar) as 表中文描述,
'' as 表类型,
'' as 表创建时间,
pg_attribute.attnum as 字段编号,
pg_attribute.attname as 字段名,
col_description(pg_attribute.attrelid,pg_attribute.attnum) as 字段描述,
format_type(pg_attribute.atttypid,pg_attribute.atttypmod) as 字段类型,
(case when pg_attribute.attlen > 0 then pg_attribute.attlen else pg_attribute.atttypmod - 4 end) as 数据长度,
'' as 默认值,
pg_attribute.attnotnull as 是否为空字段,
'' as 是否索引字段,
'0' as 是否分区字段,
pg_attribute.attrelid as attrelid,
pg_class.reltype as reltype
from pg_attribute ,pg_class,pg_namespace where pg_attribute.attrelid = pg_class.oid and
pg_namespace.oid = pg_class.relnamespace and pg_attribute.attnum > 0 and pg_class.relkind = 'r' and
pg_namespace.nspname = 'public') as a -- 引号更改成自己的数据库名称
left join pg_type b on a.reltype = b.oid
left join pg_index c on concat(a.attrelid,a.字段编号) = concat(c.indrelid,c.indkey)
left join (select adrelid,adnum, pg_get_expr(adbin, adrelid) as adrename from pg_attrdef)
as d on concat(a.attrelid,a.字段编号) = concat(d.adrelid,d.adnum)

通过对报错的分析得知在select附件的语法出现错误。

但是仔细观察sql,并不存在sql的语法错误。之后逐行全选时查看到如下现象:

a5d51454e81ba0ebb08b128f88dafe6b.png

细心的同学会发现,在逗号后面多出了一个空格。但是在pgsql中运行一般的sql语句:如select a.id, a.name from table a即便是逗号后面有很多个空格,该sql运行也不会出现语法错误。

解决方法,在将select返回集中的空格都删除后,该条sql运行正常:

9e945cfbc60038b1df040af275eb2831.png

具体导致原因不是很清楚,希望有对pgsql了解的大神能够解惑。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在 PostgreSQL 中使用 `pg_size_pretty` 函数时出现错误,可能是因为该函数不在当前的数据库模式中可用。你可以尝试通过以下两种方式解决问题: 1. 使用完全限定的函数名称:`pg_catalog.pg_size_pretty` 例如,将查询语句中的 `pg_size_pretty` 替换为 `pg_catalog.pg_size_pretty`。这将确保使用完整的函数路径,而不仅仅是函数名称。 ```sql SELECT pg_catalog.pg_size_pretty(pg_total_relation_size(current_database())) AS total_size, pg_catalog.pg_size_pretty(pg_database_size(current_database())) AS database_size; ``` 2. 切换到正确的数据库模式 在 PostgreSQL 中,函数可以位于不同的模式中。如果 `pg_size_pretty` 函数位于其他模式中而不是默认的模式中,你需要切换到该模式才能使用它。 首先,可以通过以下查询语句查看函数所在的模式: ```sql SELECT proname, pronamespace::regnamespace AS schema FROM pg_proc WHERE proname = 'pg_size_pretty'; ``` 查询结果将显示函数 `pg_size_pretty` 的模式。然后,你可以使用以下命令切换到正确的模式: ```sql SET search_path TO schema_name; ``` 其中,`schema_name` 是函数所在的模式名称。切换到正确的模式后,你应该能够正常使用 `pg_size_pretty` 函数。 请注意,以上解决方法假设你具有足够的权限来执行这些操作。如果你没有足够的权限或者遇到其他问题,请联系数据库管理员进行进一步的支持和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值