使用DuckDB查询PostgreSQL时遇语法错误求助
DuckDB连接PostgreSQL查询时FORMAT binary语法错误的解决方法
问题描述
通过DuckDB的postgres_attach连接PostgreSQL后,执行查询语句时触发语法错误,错误指向FORMAT binary部分:
连接语句:
ATTACH postgres_attach('hostaddr=192.168.0.1 port=5432 dbname=mydb connect_timeout=20 user=postgres password=masterkey');
报错的查询语句:
SELECT ['idacessohabilitacao'] FROM ibroker.main.acessohabilitacao WHERE ctid BETWEEN '(0,0)'::tid AND '(4294967295,0)'::tid) TO STDOUT (FORMAT binary);
翻译后的错误提示:
SQL错误:准备COPY语句失败
COPY (SELECT NULL FROM "public"."acessohabilitacao" WHERE ctid BETWEEN '(0,0)'::tid AND '(4294967295,0)'::tid) TO STDOUT (FORMAT binary);
FROM ibroker.main.acessohabilitacao;
错误:在‘binary’附近存在语法错误
第2行:...'::tid AND '(4294967295,0)'::tid) TO STDOUT (FORMAT binary);
^
错误原因
- 查询语句自身语法错误:WHERE子句末尾多了一个多余的右括号;SELECT子句中
['idacessohabilitacao']是DuckDB数组语法,若要引用列需改为idacessohabilitacao或"idacessohabilitacao"。 - 跨库导出语法不兼容:DuckDB将带
TO STDOUT (FORMAT binary)的查询转换为PostgreSQL的COPY语句时,生成的FORMAT binary不符合PostgreSQL语法——PostgreSQL要求FORMAT参数值必须加单引号(即FORMAT 'binary'),缺少单引号导致解析失败。
解决方法
方法1:先导入DuckDB临时表再导出
先将PostgreSQL数据查询到DuckDB临时表,再用DuckDB语法导出,避免跨语法兼容问题:
-- 1. 连接PostgreSQL(已执行可跳过) ATTACH postgres_attach('hostaddr=192.168.0.1 port=5432 dbname=mydb connect_timeout=20 user=postgres password=masterkey'); -- 2. 将数据导入DuckDB临时表 CREATE TEMP TABLE temp_habilitacao AS SELECT idacessohabilitacao FROM ibroker.main.acessohabilitacao WHERE ctid BETWEEN '(0,0)'::tid AND '(4294967295,0)'::tid; -- 3. 从临时表导出为binary格式到标准输出 SELECT * FROM temp_habilitacao TO STDOUT (FORMAT binary);
方法2:使用PostgreSQL原生COPY语法(可选)
如果需要直接在PostgreSQL端执行导出,可通过DuckDB调用原生PostgreSQL语句:
CALL postgres_execute('COPY (SELECT idacessohabilitacao FROM ibroker.main.acessohabilitacao WHERE ctid BETWEEN ''(0,0)''::tid AND ''(4294967295,0)''::tid) TO STDOUT FORMAT ''binary'';');
注:语句中用双单引号转义PostgreSQL语法里的单引号。
内容的提问来源于stack exchange,提问作者Gustavo Leo
相关产品推荐
相关产品推荐

