\copy
可以使用临时表。
首先,我在命令行上使用9.0版进行了测试并确认了这一点。
然后,我\copy
使用多个临时表通过SQL和psql meta命令创建了一个文件。这也对我有用。
CREATE TEMP TABLE tmp as SELECT * FROM tbl;
\copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';
呼叫:
psql -p5432 mydb -f test.sql
注意终止分号,终止分号在文件末尾是可选的(隐式终止),但在其他任何SQL语句之后(如果在psql中以交互方式执行)在最后一条之后也需要。
通常,不能将psql元命令与SQL混合在per所执行的文件中的同一行上psql -f
。我引用有关psql的手册:
对参数的解析在该行的结尾处停止,或者在找到另一个未引用的反斜杠时停止。不带引号的反斜杠被视为新元命令的开始。特殊序列\\
(两个反斜杠)标记参数的结尾,并继续解析SQL命令(如果有)。这样,SQL和psql命令可以自由地混合在一行上。但是无论如何,元命令的参数不能超出该行的末尾。
适用不同的规则后 \copy
,虽然。本质上,\copy
请参阅以下内容,psql会自动切换回SQL模式:
但是您写了所有命令都放在单独的行上。因此,这不可能是您情况下的解释。
除此之外,您是否考虑过使用COPY
(SQL命令)代替\copy
(psql meta-command)?
当然,在这种情况下,目标文件必须是服务器本地的,而不是客户端本地的。并且应用了不同的文件特权。手册:
COPY
命令中命名的文件由服务器而不是客户端应用程序直接读取或写入。因此,它们必须驻留在数据库服务器计算机(而不是客户端)上或可被其访问。PostgreSQL用户(服务器运行时使用的用户ID),而不是客户端,必须可以访问它们并对其进行读写。