Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何使用pg_read_file和missing_ok=true读取完整文件?_Postgresql_Shared Libraries - Fatal编程技术网

Postgresql 如何使用pg_read_file和missing_ok=true读取完整文件?

Postgresql 如何使用pg_read_file和missing_ok=true读取完整文件?,postgresql,shared-libraries,Postgresql,Shared Libraries,以下所有使用都运行良好: 选择pg_read_file'myFile.txt';-ok完整文件 选择pg_read_file'myFile-notExists',0,10,true;-空是可以的! 但这些都是有问题的: 选择pg_read_file'myFile-notExists.txt';-错误这不是我需要的 选择pg_read_file'myFile.txt',0,10,true;-确定不为空,但需要完整文件! 。。。我尝试使用换行函数解决此问题: 创建或替换函数pg_read_filef

以下所有使用都运行良好:

选择pg_read_file'myFile.txt';-ok完整文件 选择pg_read_file'myFile-notExists',0,10,true;-空是可以的! 但这些都是有问题的:

选择pg_read_file'myFile-notExists.txt';-错误这不是我需要的 选择pg_read_file'myFile.txt',0,10,true;-确定不为空,但需要完整文件! 。。。我尝试使用换行函数解决此问题:

创建或替换函数pg_read_filef text,缺失_ok布尔值返回文本作为$$ 选择pg_read_filef,0922337203,missing_确定 -最大9223372036854775807太大,也就是9223372036854775800。。。。 $$语言SQL不可变; 但它说错误:请求的长度太大,无法测试最大长度。。。所以我用了一个自由常数。问题1:最大文件大小值是多少

选择pg_read_file'myFile-notExists.txt',true;-好啊空是我需要的 选择pg_read_file'myFile.txt',true;-好啊完整文件。 问题2:有没有其他办法解决这个问题

在标准PostgreSQL v12\df pg_read_文件中,显示:


为什么pg_read_filetext、boolean不在pg_目录中?它将与其他模块或扩展产生一些不一致性?

使用pg_stat_文件来测试它的存在如何

CREATE or replace FUNCTION pg_read_file(f text, missing_ok boolean) RETURNS text AS $$
  SELECT case 
     when pg_stat_file(f,missing_ok) is NULL then NULL 
     else pg_read_file(f) end
$$ LANGUAGE SQL IMMUTABLE;
这里有一个争用条件,即文件可能在pg_stat_文件之后但在pg_read_文件之前消失,导致错误而不是NULL返回。

这是一个pg_read_文件错误。。。对于一个解决方案,没有@jjanes以前记忆中的种族条件,没有真正好的解决方案。实时应用程序需要谨慎

这里改变了方法,检索pg_stat_文件的信息,避免了CPU的丢失

这是一个品味的问题,我认为唱片很难看,我更喜欢JSONb

想象一下您正在使用JSONb的cenario,例如,使用

重用pg_stat_文件 创建或替换函数jsonb_read_stat_文件 f文本, 缺少\u ok布尔值默认值false 将JSONb返回为$f$ 选择j | | jsonb|u build_object'file',f',content',pg|u read_filef 从to jsonb pg_stat_filef,缺少ok tj 其中j不是NULL $f$语言SQL不可变; 要仅获取内容,模拟纯读取文件x,true,您可以使用jsonb_读取文件stat_file'/tmp/text.txt',true->>'content'

使用示例:

回声你好世界!>/tmp/text.txt psqlmydb-c SELECT jsonb_read_stat_file'/tmp/text ERROR.txt',true为NULL true psqlmydb-c选择jsonb_read_stat_file'/tmp/text.txt',true
如果文件大小大于PostgreSQL值的最大大小,您希望发生什么?您好@jjanes,大于最大大小的文件是一个大问题,我们必须避免它。。。但是长度参数second bigint强制执行一个限制。理想情况是自由大小或文件系统的最大值。谢谢,您解决了这个问题,但是,除了竞争条件外,pg_stat_文件工作中的CPU浪费。。。pg_read_file函数上似乎有一个bug。
CREATE or replace FUNCTION pg_read_file(f text, missing_ok boolean) RETURNS text AS $$
  SELECT case 
     when pg_stat_file(f,missing_ok) is NULL then NULL 
     else pg_read_file(f) end
$$ LANGUAGE SQL IMMUTABLE;
 {
   "file": "/tmp/text.txt", 
   "size": 13, 
   "isdir": false, 
   "access": "2020-08-09T14:44:28+00:00",
   "change": "2020-08-09T14:44:28+00:00", 
   "content": "Hello world!\n", 
   "creation": null, 
   "modification": "2020-08-09T14:44:28+00:00"
}