我正在生成一个 SQL 命令列表,以导出一些我最终使用 psql -f 运行的数据。查询都得到相同的数据子集,所以我想我会考虑资格并将符合条件的用户 ID 列表放在临时表中,如下所示
create temporary table tmp_export_users as (select id from users where ...)
然后在我的 \copy 命令中参考它,例如
\copy (select ... from table where user_id in (select id from tmp_export_users)) TO 'filename.csv' WITH CSV HEADER
这些都在同一个文件中,每行一个,并运行它们 -f 我得到了复制命令看不到临时表的错误,所以我猜测客户端复制命令实际上不能使用相同的 postgres会话作为 psql。
那是对的吗?有没有办法改变这种行为?
\copy
可以使用临时表。首先,我在命令行中使用9.0版测试并确认了这一点。然后我使用多个临时表
创建了一个带有 SQL 和 psql 元命令的文件。
\copy
这也对我有用。称呼:
请注意终止分号,它在文件末尾是可选的(隐式终止),但在任何其他 SQL 语句之后以及如果在 psql 中以交互方式执行的最后一个语句之后也是必需的。
通常,psql 元命令不能与 SQL 混合在一个执行的文件的同一行
psql -f
中。我引用psql 上的手册:但是,在 之后 适用不同的规则
\copy
。\copy
本质上,psql 在See之后会自动切换回 SQL 模式:但是您写道,所有命令都在单独的行上。所以这不能是你的情况的解释。
除此之外,您是否考虑过使用
COPY
(SQL 命令)而不是\copy
(psql 元命令)?当然,在这种情况下,目标文件必须是服务器本地的,而不是客户端的。并且适用不同的文件权限。手册: