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 行记录)