【问题标题】:How to insert a text file into a field in PostgreSQL?如何将文本文件插入到 PostgreSQL 的字段中?
【发布时间】:2020-01-25 18:41:57
【问题描述】:

如何在 PostgreSQL 的字段中插入文本文件?

我想插入一行,其中包含来自本地或远程文本文件的字段。

我希望有一个像 gettext() 或 geturl() 这样的函数来执行以下操作:

% INSERT INTO collection(id, path, content) VALUES(1, '/etc/motd', gettext('/etc/motd'));

-S.

【问题讨论】:

    标签: postgresql full-text-search text-files


    【解决方案1】:

    最简单的方法是使用一种可嵌入的脚本语言。下面是一个使用 plpythonu 的例子:

    创建函数 gettext(url TEXT) 返回文本 作为$$ 导入 urllib2 尝试: f = urllib2.urlopen(url) 返回 '​​'.join(f.readlines()) 除了例外: 返回 ”” $$ 语言 plpythonu;

    这个示例函数的一个缺点是它依赖于 urllib2,这意味着您必须使用“file:///”URL 来访问本地文件,如下所示:

    select gettext('file:///etc/motd');

    【讨论】:

    • 需要超级用户才能创建这个函数。最好使用客户端函数。
    • 我在最初的问题中没有看到任何东西让我相信他不是。
    【解决方案2】:

    感谢您的提示。我找到了另一个带有内置函数的答案。 您需要拥有超级用户权限才能执行该操作!

    -- 1. Create a function to load a doc
    -- DROP FUNCTION get_text_document(CHARACTER VARYING);
    CREATE OR REPLACE FUNCTION get_text_document(p_filename CHARACTER VARYING)
      RETURNS TEXT AS $$
      -- Set the end read to some big number because we are too lazy to grab the length
      -- and it will cut of at the EOF anyway
      SELECT CAST(pg_read_file(E'mydocuments/' || $1 ,0, 100000000) AS TEXT);
    $$ LANGUAGE sql VOLATILE SECURITY DEFINER;
    ALTER FUNCTION get_text_document(CHARACTER VARYING) OWNER TO postgres;
    
    -- 2. Determine the location of your cluster by running as super user:
    SELECT name, setting FROM pg_settings WHERE name='data_directory'; 
    
    -- 3. Copy the files you want to import into <data_directory>/mydocuments/
    --    and test it: 
    SELECT get_text_document('file1.txt');
    
    -- 4. Now do the import (HINT: File must be UTF-8) 
    INSERT INTO mytable(file, content)
      VALUES ('file1.txt', get_text_document('file1.txt'));
    

    【讨论】:

      【解决方案3】:

      Postgres 的COPY command 正是为此而生的。

      我的建议是将其上传到临时表,然后在您对格式感到满意时将数据传输到主表。例如

      CREATE table text_data (text varchar)
      COPY text_data FROM 'C:\mytempfolder\textdata.txt';
      INSERT INTO main_table (value) 
        SELECT string_agg(text, chr(10)) FROM text_data;
      DROP TABLE text_data; 
      

      另见this question

      【讨论】:

        【解决方案4】:

        你不能。您需要编写一个程序来读取文件内容(或 URL)并将其存储到所需的字段中。

        【讨论】:

          【解决方案5】:

          使用复制而不是插入

          参考:http://www.commandprompt.com/ppbook/x5504#AEN5631

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-26
            • 1970-01-01
            • 2016-04-01
            • 2021-05-22
            • 2020-05-20
            • 1970-01-01
            • 2020-07-13
            • 1970-01-01
            相关资源
            最近更新 更多