((editar após resposta: esta é uma pergunta/problema típico de XY , não há restrição de uso de caminho absoluto , nas funções FileSystem do PostgreSQL. Como comentário @LaurenzAlbe, "apenas tente". ))
Preciso exportar/importar arquivos JSON, arquivos CSV, XML, GeoJSON, etc. Exemplo:
CREATE EXTENSION adminpack;
SELECT pg_catalog.pg_file_write(
'base/pgsql_tmp/test1_hello.txt',
E'Hello\n\n\tWorld!',
false
);
Todos são temporários (existe em um BEGIN/COMMIT), mas não tem problema?
nenhum risco em conflito de nome de arquivo? (por exemplo, meu nome de arquivo e um nome de arquivo de tabela temporária gerenciada do pgsql)
não há risco de
base
estouro de volume do diretório ( )? (por exemplo, quando eu salvo um arquivo grande lá)nenhum risco em sequências de leitura e gravação no mesmo nome de arquivo? Eles serão síncronos nas seções BEGIN/COMMIT?
NOTAS E CONTEXTO
Às vezes podemos dizer que "servidores de banco de dados não são projetados para I/O geral de arquivos" ( ref ), mas às vezes precisamos (!), para simplificar e automatizar procedimentos de interface ou ETL .
Sobre o item 1 e o uso prático, para simplificar os procedimentos de exportação/importação (e não precisar lembrar onde está data_directory
), talvez seja melhor criar um ${data_directory}/base/pgsql_tmp/MyArea
link simbólico para outra área (por exemplo /tmp/MyRealArea
, ).
Questão 1:
É uma má ideia criar esses arquivos no diretório de dados do PostgreSQL. Isso é apenas para arquivos de banco de dados. Além disso, você não pode ter certeza de que
pgsql_tmp
está lá (ele só é criado quando o primeiro arquivo temporário é gravado).Use um caminho absoluto e escreva o arquivo em outro lugar, de preferência em
/var
.Questão 2
É claro que existe o risco de encher o sistema de arquivos - seja por meio dos arquivos que você grava ou por meio de arquivos temporários que o banco de dados grava.
Questão 3
Isso depende do seu código; o banco de dados não garante que você não escreva sobre o mesmo arquivo em duas transações simultâneas.