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 行记录)
相关推荐
言德斐6 小时前
SQL性能优化的思路及策略
数据库·sql·性能优化
码界奇点6 小时前
Django视图从基础到高级的全面解析
数据库·django·sqlite·web·python3.11
Allan_20256 小时前
数据库学习
数据库·学习
fen_fen6 小时前
人大金仓数据库kingbase8创建表示例
数据库·oracle
一勺菠萝丶6 小时前
「您的连接不是私密连接」详解:为什么 HTTPS 证书会报错,以及如何正确配置子域名证书
数据库·网络协议·https
²º²²এ松7 小时前
蓝牙低功耗(BLE)通信的中心设备/外围设备(连接角色)、主机/从机(时序角色)、客户端/服务器(数据交互角色)的理解
运维·服务器·数据库
百锦再7 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
数据库知识分享者小北8 小时前
云栖重磅|瑶池数据库:从云原生数据底座向“AI就绪”的多模态数据底座演进
数据库·人工智能·云原生
_Johnny_8 小时前
Redis 升级操作指南:单机与主从模式
数据库·redis·缓存
源力祁老师8 小时前
ODOO数据文件(XML、CSV、SQL)是如何转换并加载到 Odoo 数据库
xml·数据库·sql