((回答后编辑:这是一个典型的 XY 问题/问题,在 PostgreSQL 的 FileSystem 函数上使用绝对路径没有限制。正如@LaurenzAlbe 评论,“试一试”。))
我需要导出/导入 JSON 文件、CSV 文件、XML、GeoJSON 等。示例:
CREATE EXTENSION adminpack;
SELECT pg_catalog.pg_file_write(
'base/pgsql_tmp/test1_hello.txt',
E'Hello\n\n\tWorld!',
false
);
所有都是临时的(存在于 BEGIN/COMMIT 中),但没问题?
没有文件名冲突的风险?(例如我的文件名和 pgsql 的托管临时表文件名)
没有目录 (
base
) 卷溢出的风险?(例如,当我在那里保存一个大文件时)相同文件名上的读写序列没有风险吗?它们将在 BEGIN/COMMIT 部分同步?
注释和上下文
有时我们可以说“数据库服务器不是为一般文件 I/O 设计的”(ref),但有时我们需要它(!),以简化和自动化ETL或接口过程。
关于第 1 项和实际用途,为了简化导出/导入过程(并且不需要记住在哪里是data_directory
),最好创建一个${data_directory}/base/pgsql_tmp/MyArea
到其他区域的符号链接(例如/tmp/MyRealArea
)。
问题一:
在 PostgreSQL 数据目录中创建这些文件是个坏主意。这仅适用于数据库文件。此外,您根本无法确定它
pgsql_tmp
是否存在(它仅在写入第一个临时文件时创建)。使用绝对路径并将文件写入其他位置,最好是
/var
.问题2
当然,填满文件系统是有风险的——无论是通过您编写的文件,还是通过数据库写入的临时文件。
问题 3
这取决于您的代码;数据库不保证您不会在两个并发事务中写入同一个文件。