DuckDB 的postgresql插件无法访问GooseDB

GooseDB使用DuckDB后台,支持postgresql协议前端访问,但是它无法用DuckDB 的postgresql插件访问。

操作步骤如下

bash 复制代码
C:\d\goosedb>goosedb14 start
{"level":"info","msg":"===== GooseDB Freeware(For Non-Commercial Use Only) [read_write] ===== valid until: 2027-10-01 08:00:00 +0800 CST, owner: AnyBody =====","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"MaxConnections = 10","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"DuckDB !!read_write!! Mode)","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"SET ieee_floating_point_ops = false","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"SET autoload_known_extensions=1","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"SET preserve_insertion_order = false","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"ATTACH ':memory:' as memdb","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"LOAD parquet","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"LOAD json","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"GooseDB v1.4.0.0 (DuckDB v1.4.0) build_date:2025-09-29","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"goosedb listening on 0.0.0.0:1234","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"restapi listening on 0.0.0.0:5678","time":"2025-10-01T20:42:13+08:00"}
{"level":"info","msg":"db-file: data\\goosedb.ddb, cfg-file: conf\\goosedb.cfg","time":"2025-10-01T20:42:13+08:00"}

attach命令不报错,但use该数据库出错。

sql 复制代码
C:\d>duckdb140
DuckDB v1.4.0 (Andium) b8a06e4a22
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D load postgres;
100% ▕██████████████████████████████████████▏ (00:02:38.35 elapsed)
D ATTACH 'dbname=goosedb user=gooseadmin host=127.0.0.1 port=1234' AS goosedb (TYPE postgres);
IO Error:
Unable to connect to Postgres at dbname=goosedb user=gooseadmin host=127.0.0.1 port=1234: connection to server at "127.0.0.1", port 1234 failed: fe_sendauth: no password supplied

D ATTACH 'dbname=goosedb user=gooseadmin host=127.0.0.1 port=1234 password=000000' AS goosedb (TYPE postgres);
D use goosedb;
Invalid Error:
Failed to execute query "BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SELECT oid, nspname
FROM pg_namespace

ORDER BY oid;

SELECT pg_namespace.oid AS namespace_id, relname, relpages, attname,
    pg_type.typname type_name, atttypmod type_modifier, pg_attribute.attndims ndim,
    attnum, pg_attribute.attnotnull AS notnull, NULL constraint_id,
    NULL constraint_type, NULL constraint_key
FROM pg_class
JOIN pg_namespace ON relnamespace = pg_namespace.oid
JOIN pg_attribute ON pg_class.oid=pg_attribute.attrelid
JOIN pg_type ON atttypid=pg_type.oid
WHERE attnum > 0 AND relkind IN ('r', 'v', 'm', 'f', 'p')
UNION ALL
SELECT pg_namespace.oid AS namespace_id, relname, NULL relpages, NULL attname, NULL type_name,
    NULL type_modifier, NULL ndim, NULL attnum, NULL AS notnull,
    pg_constraint.oid AS constraint_id, contype AS constraint_type,
    conkey AS constraint_key
FROM pg_class
JOIN pg_namespace ON relnamespace = pg_namespace.oid
JOIN pg_constraint ON (pg_class.oid=pg_constraint.conrelid)
WHERE relkind IN ('r', 'v', 'm', 'f', 'p') AND contype IN ('p', 'u')
ORDER BY namespace_id, relname, attnum, constraint_id;

SELECT 0 AS oid, 0 AS enumtypid, '' AS typname, '' AS enumlabel
LIMIT 0;

SELECT n.oid, t.typrelid AS id, t.typname as type, pg_attribute.attname, sub_type.typname
FROM pg_type t
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
JOIN pg_class ON pg_class.oid = t.typrelid
JOIN pg_attribute ON attrelid=t.typrelid
JOIN pg_type sub_type ON (pg_attribute.atttypid=sub_type.oid)
WHERE pg_class.relkind = 'c'
AND t.typtype='c'

ORDER BY n.oid, t.oid, attrelid, attnum;

SELECT pg_namespace.oid, tablename, indexname
FROM pg_indexes
JOIN pg_namespace ON (schemaname=nspname)

ORDER BY pg_namespace.oid;
": ERROR:  [QUERY] Multiple statements not allowed!

D .exit

用psql工具可以访问表,但有些命令也不支持。DuckDB访问表出现use同样的错误。

sql 复制代码
C:\d>\d\pg18\bin\psql -h 127.0.0.1 -U gooseadmin -d goosedb -p 1234
用户 gooseadmin 的口令:

psql (18beta1, 服务器 16.10)
输入 "help" 来获取帮助信息.

goosedb=> \dt
ERROR:  [QUERY] ERROR: Catalog Error: Scalar Function with name pg_get_userbyid does not exist!
Did you mean "pg_get_expr"?

LINE 4:   pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
          ^
goosedb=> select * from t2;
           ts            | a
-------------------------+---
 2025-09-14 08:18:39.386 | 1
 2025-09-14 08:20:17.458 | 2
 2025-09-14 08:21:37.85  | 3
 2025-09-14 08:21:37.85  | 4
 2025-09-14 08:51:16.755 | 5
 2025-09-14 08:51:16.755 | 5
(6 行记录)


goosedb=> \q

C:\d>duckdb140
DuckDB v1.4.0 (Andium) b8a06e4a22
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D load postgres;
D ATTACH 'dbname=goosedb user=gooseadmin host=127.0.0.1 port=1234 password=000000' AS goosedb (TYPE postgres);
D from goosedb.t2;
Invalid Error:
Failed to execute query "BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
...

": ERROR:  [QUERY] Multiple statements not allowed!

两种操作都引发Multiple statements not allowed!错误。应该是DuckDB 的postgresql插件使用了goosedb不支持的命令引起的。用psql分别执行上述语句,第一句会出错,下面的几句都能执行。

sql 复制代码
C:\d>\d\pg18\bin\psql -h 127.0.0.1 -U gooseadmin -d goosedb -p 1234
用户 gooseadmin 的口令:

psql (18beta1, 服务器 16.10)
输入 "help" 来获取帮助信息.

goosedb=> BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
ERROR:  [QUERY] Parser Error: syntax error at or near "ISOLATION"

LINE 1: BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ
                          ^
goosedb=> BEGIN TRANSACTION;
BEGIN
goosedb=*> SELECT pg_namespace.oid AS namespace_id, relname, relpages, attname,
goosedb-*>     pg_type.typname type_name, atttypmod type_modifier, pg_attribute.attndims ndim,
goosedb-*>     attnum, pg_attribute.attnotnull AS notnull, NULL constraint_id,
goosedb-*>     NULL constraint_type, NULL constraint_key
goosedb-*> FROM pg_class
goosedb-*> JOIN pg_namespace ON relnamespace = pg_namespace.oid
goosedb-*> JOIN pg_attribute ON pg_class.oid=pg_attribute.attrelid
goosedb-*> JOIN pg_type ON atttypid=pg_type.oid
goosedb-*> WHERE attnum > 0 AND relkind IN ('r', 'v', 'm', 'f', 'p')
goosedb-*> UNION ALL
goosedb-*> SELECT pg_namespace.oid AS namespace_id, relname, NULL relpages, NULL attname, NULL type_name,
goosedb-*>     NULL type_modifier, NULL ndim, NULL attnum, NULL AS notnull,
goosedb-*>     pg_constraint.oid AS constraint_id, contype AS constraint_type,
goosedb-*>     conkey AS constraint_key
goosedb-*> FROM pg_class
goosedb-*> JOIN pg_namespace ON relnamespace = pg_namespace.oid
goosedb-*> JOIN pg_constraint ON (pg_class.oid=pg_constraint.conrelid)
goosedb-*> WHERE relkind IN ('r', 'v', 'm', 'f', 'p') AND contype IN ('p', 'u')
goosedb-*> ORDER BY namespace_id, relname, attnum, constraint_id;
 namespace_id |    relname    | relpages | attname | type_name | type_modifier | ndim | attnum | notnull | constraint_id | constraint_type | constraint_key
--------------+---------------+----------+---------+-----------+---------------+------+--------+---------+---------------+-----------------+----------------
         2444 | postgres_type |          |         |           |               |      |        |         |    2545000000 | p               | {0}
         2444 | postgres_type |          |         |           |               |      |        |         |    2545000001 | u               | {1}
(2 行记录)


goosedb=*> SELECT 0 AS oid, 0 AS enumtypid, '' AS typname, '' AS enumlabel
goosedb-*> LIMIT 0;
 oid | enumtypid | typname | enumlabel
-----+-----------+---------+-----------
(0 行记录)


goosedb=*> SELECT n.oid, t.typrelid AS id, t.typname as type, pg_attribute.attname, sub_type.typname
goosedb-*> FROM pg_type t
goosedb-*> JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
goosedb-*> JOIN pg_class ON pg_class.oid = t.typrelid
goosedb-*> JOIN pg_attribute ON attrelid=t.typrelid
goosedb-*> JOIN pg_type sub_type ON (pg_attribute.atttypid=sub_type.oid)
goosedb-*> WHERE pg_class.relkind = 'c'
goosedb-*> AND t.typtype='c'
goosedb-*>
goosedb-*> ORDER BY n.oid, t.oid, attrelid, attnum;
 oid | id | type | attname | typname
-----+----+------+---------+---------
(0 行记录)

goosedb=!> end;
ROLLBACK
goosedb=> SELECT pg_namespace.oid, tablename, indexname
goosedb-> FROM pg_indexes
goosedb-> JOIN pg_namespace ON (schemaname=nspname)
goosedb->
goosedb-> ORDER BY pg_namespace.oid;
 oid | tablename | indexname
-----+-----------+-----------
(0 行记录)
相关推荐
百锦再1 天前
大型省级政务平台采用金仓数据库(KingbaseES)
开发语言·数据库·后端·rust·eclipse
Chloeis Syntax1 天前
MySQL初阶学习日记(2)--- 数据库的数据类型和表的操作
数据库·学习·mysql
小毅&Nora1 天前
【后端】【面试】 ③ PostgreSQL高级面试题(含答案与实战案例)
postgresql·面试·职场和发展
AI绘画小331 天前
渗透测试数据库判断卡壳?分类 + 方法 + SQL/NoSQL 脚本速用
服务器·数据库·sql·mysql·web安全·nosql
无敌最俊朗@1 天前
01-总结
java·jvm·数据库
think2cat1 天前
图书馆的"备份书库"与"时光机":MongoDB副本集深度揭秘
数据库·mongodb
清风6666661 天前
基于单片机的多模式智能洗衣机设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
武子康1 天前
Java-167 Neo4j CQL 实战:CREATE/MATCH 与关系建模速通 案例实测
java·开发语言·数据库·python·sql·nosql·neo4j
Fency咖啡1 天前
redis进阶 - 底层数据结构
数据结构·数据库·redis