如何用SQL导出全文文件?

2023-12-02

将全文字段导入/导出为文件的简单方法?

  • 解决“加载为多行”的问题。
    尝试使用 SQLCOPY我只能将完整文件转换为完整表格,而不能转换为单个文本字段,因为 COPY 中的每一行都是原始的。

  • 解决了保存回问题,将完整的 XML 文件保存在文件系统中,而不改变二进制表示(保留 SHA1),并且没有其他外部过程(如 Unixsed use).

主要问题出在export,这就是本页的标题。

PS:往返过程中的“同文件证明”——导入、导出回来并与原始文件比较——可以通过以下方式获得sha1sum示范;请参阅下面的示例。因此,一个自然的需求也是通过 SQL 检查相同的 SHA1,避免在简单的检查任务上导出。


所有示例

  1. 导入全文进入全表(不是我需要的),
    并测试可以导出为相同 text.
    PS:我需要将一个文件导入到一个字段和一行中。

  2. 转换将整个表放入一个文件中(不是我需要的)
    并测试可以导出相同 text.
    PS:我需要将一行(一个字段)放入一个文件中。

  3. 通过SQL计算hash,字段的 SHA1.
    Must be the same比较时...否则这对我来说不是一个解决方案。

以下示例显示了每个问题和一个不太优雅的解决方法。

1. 进口

CREATE TABLE ttmp (x text);
COPY ttmp FROM '/tmp/test.xml' ( FORMAT text ); -- breaking lines lines
COPY (SELECT x FROM ttmp) TO '/tmp/test_back.xml' (format TEXT);

检查原件和“背面”的内容是否完全相同:

sha1sum /tmp/test*.*
  570b13fb01d38e04ebf7ac1f73dfad0e1d02b027  /tmp/test_back.xml
  570b13fb01d38e04ebf7ac1f73dfad0e1d02b027  /tmp/test.xml

PS:看起来很完美,但这里的问题是使用了很多行。真正的导入解决方案可以将文件导入一行(和一个字段)。真正的导出解决方案是一个 SQL 函数,它生成test_back.xml来自(单个字段的)单行。

2. 将全表转换为一个文件

用它来存储 XML:

CREATE TABLE xtmp (x xml);
INSERT INTO  xtmp (x) 
  SELECT array_to_string(array_agg(x),E'\n')::xml FROM ttmp
;
COPY (select x::text from xtmp) TO '/tmp/test_back2-bad.xml' ( FORMAT text );

...但不起作用,因为我们可以检查sha1sum /tmp/test*.xml, 不会产生相同的结果 for test_back2-bad.xml.

所以也翻译一下\n到 chr(10),使用外部工具(perl、sed 或任何其他)
perl -p -e 's/\\n/\n/g' /tmp/test_back2-bad.xml > /tmp/test_back2-good.xml

Ok, now test_back2-good.xml具有与原始相同的哈希值(在我的示例中为“570b13fb ...”)。 使用 Perl 是一种解决方法,没有它怎么办?

3. 字段的SHA1

SELECT encode(digest(x::text::bytea, 'sha1'), 'hex') FROM xtmp;

未解决,与原始哈希值不一样(我的示例中的“570b13fb ...”)...也许::text强制内部代表\n符号,因此解决方案将直接转换为bytea,但这是一个无效的强制转换。其他解决方法也不是解决方案,

SELECT encode(digest( replace(x::text,'\n',E'\n')::bytea, 'sha1' ), 'hex') 
FROM xtmp

...我尝试CREATE TABLE btmp (x bytea) and COPY btmp FROM '/tmp/test.xml' ( FORMAT binary ),但出现错误(“未知的复制文件签名”)。


COPY不是为此设计的。它旨在处理表结构数据,因此如果没有某种划分行和列的方法,它就无法工作;总会有一些角色COPY FROM解释为分隔符,并且为此COPY TO如果在您的数据中找到转义序列,则会插入一些转义序列。如果您正在寻找通用文件 I/O 工具,这不太好。

事实上,数据库服务器并不是为一般文件 I/O 设计的。一方面,anything直接与服务器的文件系统交互将需要超级用户角色。如果可能的话,您应该像往常一样查询表,并在客户端处理文件 I/O。

也就是说,有几种选择:

  • 内置的pg_read_file()函数,以及pg_file_write()来自adminpack模块,提供与文件系统最直接的接口,但它们都仅限于集群的数据目录(我不建议在其中存储随机的用户创建的文件)。
  • lo_import() and lo_export()是我所知道的唯一直接处理文件 I/O 的内置函数,并且可以不受限制地访问服务器的文件系统(在主机操作系统施加的限制内),但是大对象接口并不是特别用户友好....
  • 如果您安装像 Perl 这样的过程语言的不受信任变体(plperlu) 或 Python (plpythonu),您可以为该语言的本机 I/O 例程编写包装函数。
  • 没有什么是你无法完成的COPY TO PROGRAM如果你有足够的决心 - 对于一个人来说,你可以COPY (SELECT 1) TO PROGRAM 'mv <source_file> <target_file>'解决以下限制pg_file_write()- 尽管这在某种程度上模糊了 SQL 和外部工具之间的界限(无论继承你的代码库的人可能不会印象深刻......)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用SQL导出全文文件? 的相关文章

随机推荐

  • pdf 小丑 - 不突出显示特定搜索关键字

    我正在使用 pdf clown 和 pdfclown 0 2 0 HEAD jar 我编写了下面的代码来突出显示中文 pdf 文件中的关键字搜索 相同的代码在英文 pdf 文件中工作正常 import java awt Color impo
  • 使用 jQuery 的轮播

    我知道那里有可用的插件 但我正在尝试制作一个自己的插件 但在此之前我试图理解将其制作为无限 圆形轮播的概念 这是我的到目前为止 http jsfiddle net hbk35 KPKyz 3 HTML div ul li div 0 div
  • Div "contenteditable" :获取和删除插入符号之前的单词

    谢谢这个问题和 Tim Down 发布的答案 我做了一个函数来获取 contenteditable div 中插入符号之前的单词 这是一个fiddle 这是函数 function getWordPrecedingCaret containe
  • 从 powershell 为 azure 函数创建函数键

    是否有可能为刚刚从 powershell 脚本创建的 azure 函数创建一个函数键 我有一个发布管道来为 azure 函数创建整个环境 它工作正常 但我缺少的一部分是该函数的自定义函数键 我不想使用默认密钥 我可以在门户中创建新密钥 但我
  • 使用 lambda 函数对 filter() 进行复杂性分析

    给定两个列表 list1 and list2 list3 filter lambda x x in list1 list2 这将返回两个列表的交集 我怎样才能找到这个算法的复杂度 我发现时间复杂度x in list1 is O n 其中 n
  • 理解/mySQL 又名欺骗 Django 中的外键关系

    所以我继承了一些django mySQL 表非常简单 其中父级不是 FK 关系 只是 父级 id CREATE TABLE Child id int 10 unsigned NOT NULL AUTO INCREMENT parent in
  • ASP.NET 中带有和不带有委托的事件

    在一些 ASP NET 示例中 我看到事件与委托一起使用像这样有时没有他们像这样 请解释 所有事件都是委托类型 它们都继承自EventHandler继承自MulticastDelegate其间断自Delegate 有时 或者我宁愿说大多数时
  • 检查 URL 是否转到包含文本“404”的页面

    我有一个 bash 脚本来检查 URL 列表的 HTTP 状态代码 但我意识到有些虽然看起来是 200 但实际上显示包含 错误 404 的页面 我该如何检查呢 这是我当前的脚本 bin bash while read LINE do cur
  • Javascript-firefox:如何从本地 png 文件设置自定义光标?

    如何从本地图像文件为当前页面设置自定义光标 基本上我需要使用 javascript 以编程方式更改为不同的光标 但光标本地存储在我的硬盘驱动器上 你不能 但见下文 因为file 不能从其他协议访问或引用 通过 JavaScript 包含光标
  • 使用 预加载 JSON 文件

    我正在使用 Angular 5 应用程序 并且正在加载相当大的 JSON 文件 问题是加载main需要很长时间 js捆绑 初始化它 引导 Angular 应用程序 稍后获取该 JSON 文件 如果我可以在 Angular 应用程序准备就绪时
  • 如何通过php脚本发送邮件?

    我如何通过php脚本发送邮件 我正在尝试做这样的事情 for k 0 k lt x gt length 1 k for l 0 l lt j 1 l if y gt item k gt nodeValue JobNoArr l Accept
  • c++中的std::string有编码格式吗

    我想找到关于std string的默认编码格式 我想找出编码格式 但我不知道 c 中的std string有编码格式吗 简单的答案 std string定义为std basic string
  • 在 ActionBarActivity 中设置底部的 ActionBar Tab

    你好 我是 Android 菜鸟 我在用appcompat支持库添加选项卡ActionBarActivity 我已经编写了要添加的代码 但选项卡显示在顶部 请在屏幕截图中看到它 我想设置这些Tabs这将出现在底部 知道为什么会这样吗 pri
  • 递归匿名函数 Matlab

    我知道这不是匿名函数的用途 但就像一个谜题一样 我尝试通过匿名函数创建递归函数 递归函数的原型显然就是阶乘函数 问题是很难区分大小写within匿名函数 到目前为止我所做的事情如下 f cn n f eval if n gt 1 f cn
  • VSCode |新窗口选择语言

    我错误地按下了 不要再显示这个 我怎样才能让 vscode 再次显示该选项 有一个设置可以启用 禁用该消息 Workbench gt Editor gt Untitled Hint 通过选择 不再显示 您禁用了该设置 将其设置为hidden
  • C++ 可变参数宏:如何检索参数值

    类中有很多实现类似的方法 只是方法的名称和参数列表不同 void function1 int a bool b mMember gt function1 a b void function2 double a string b mMembe
  • 从谷歌地图获取路线和地图上每2公里的点

    我知道 GPS 坐标我的起点和终点 现在我想知道这次旅行的行车路线 然后获取这条路线上每2公里的GPS坐标 我怎样才能用 php javascript 做到这一点 Thanks 添加的代码
  • html 输出中的特殊字符

    我希望直接打印像 这样的字符 但在源代码中 显示为 248 如果输出通过Html Encode 它不会呈现正确的字符 但是 248 在我的配置中
  • 从 Windows 注册表启动时启动应用程序时,返回 ClickOnce 版本不起作用

    我正在使用以下代码System Deployment返回我的 NET 3 5 C 应用程序的 ClickOnce 版本 public string version get System Reflection Assembly assembl
  • 如何用SQL导出全文文件?

    有将全文字段导入 导出为文件的简单方法 解决 加载为多行 的问题 尝试使用 SQLCOPY我只能将完整文件转换为完整表格 而不能转换为单个文本字段 因为 COPY 中的每一行都是原始的 解决了保存回问题 将完整的 XML 文件保存在文件系统