Postgresql 如何使用pg_read_file和missing_ok=true读取完整文件?
以下所有使用都运行良好: 选择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_文件中,显示: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_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"
}