AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 1742
Accepted
SabreWolfy
SabreWolfy
Asked: 2011-03-15 12:38:14 +0800 CST2011-03-15 12:38:14 +0800 CST 2011-03-15 12:38:14 +0800 CST

如何将(文件)数据插入 PostgreSQL bytea 列?

  • 772

这个问题与 bytea v. oid v. blobs v. large objects 等无关。

我有一个包含主键integer字段和bytea字段的表。我想在bytea字段中输入数据。这大概可以通过其中一种PL/语言来完成,我将来可能会考虑这样做PL/Python。

由于我仍在测试和试验,我只想使用“标准”SQL 语句从文件(在服务器上)插入数据。我知道只有在服务器上具有写入权限的管理员才能以我想要的方式插入数据。在这个阶段我并不担心,因为用户目前不会插入bytea数据。我已经搜索了各种 StackExchange 站点、PostgreSQL 档案和互联网,但一直没有找到答案。

编辑: 2008 年的 这个讨论意味着我想做的事情是不可能的。bytea那么字段 是如何使用的呢?

编辑: 这个2005 年的类似问题仍未得到解答。

已解决:网站上提供的详细信息psycopg为我用 Python 编写的解决方案提供了基础。也可以使用 . 将二进制数据插入bytea列中PL/Python。我不知道这是否可以使用“纯”SQL。

postgresql plpgsql
  • 6 6 个回答
  • 184380 Views

6 个回答

  • Voted
  1. sudalai
    2015-03-18T05:20:45+08:002015-03-18T05:20:45+08:00

    使用pg_read_file('location_of file')::bytea.

    例如,

    create table test(id int, image bytea);
    insert into test values (1, pg_read_file('/home/xyz')::bytea);
    

    手动的

    • 33
  2. Best Answer
    Jack Douglas
    2011-05-27T11:23:50+08:002011-05-27T11:23:50+08:00

    作为超级用户:

    create or replace function bytea_import(p_path text, p_result out bytea) 
                       language plpgsql as $$
    declare
      l_oid oid;
    begin
      select lo_import(p_path) into l_oid;
      select lo_get(l_oid) INTO p_result;
      perform lo_unlink(l_oid);
    end;$$;
    

    lo_get在 9.4 中引入,因此对于旧版本,您需要:

    create or replace function bytea_import(p_path text, p_result out bytea) 
                       language plpgsql as $$
    declare
      l_oid oid;
      r record;
    begin
      p_result := '';
      select lo_import(p_path) into l_oid;
      for r in ( select data 
                 from pg_largeobject 
                 where loid = l_oid 
                 order by pageno ) loop
        p_result = p_result || r.data;
      end loop;
      perform lo_unlink(l_oid);
    end;$$;
    

    然后:

    insert into my_table(bytea_data) select bytea_import('/my/file.name');
    
    • 31
  3. goodside
    2011-04-02T10:27:02+08:002011-04-02T10:27:02+08:00

    此解决方案在运行时方面并不十分有效,但与为COPY BINARY. 此外,它不需要 bash 之外的任何库或脚本语言。

    首先,将文件转换为 hexdump,使文件大小翻倍。xxd -p让我们非常接近,但它会引发一些我们必须处理的烦人的换行符:

    xxd -p /path/file.bin | tr -d '\n' > /path/file.hex
    

    接下来,将 PostgreSQL 中的数据作为一个非常大的text字段导入。这种类型每个字段值最多可容纳 1 GB,因此对于大多数用途我们应该没问题:

    CREATE TABLE hexdump (hex text); COPY hexdump FROM '/path/file.hex';
    

    现在我们的数据是一个非常大的十六进制字符串,我们使用 PostgresQLdecode将它变成一个bytea类型:

    CREATE TABLE bindump AS SELECT decode(hex, 'hex') FROM hexdump;
    
    • 16
  4. user1555
    2011-04-23T15:18:49+08:002011-04-23T15:18:49+08:00

    xxd的答案很好,对于小文件来说,速度非常快。下面是我正在使用的示例脚本。

    xxd  -p /home/user/myimage.png | tr -d '\n' > /tmp/image.hex
    echo "
        -- CREATE TABLE hexdump (hex text);
        DELETE FROM hexdump;
        COPY hexdump FROM '/tmp/image.hex';
    
        -- CREATE TABLE bindump (binarydump bytea);
        DELETE FROM bindump;
    
        INSERT INTO bindump (binarydump)  
        (SELECT decode(hex, 'hex') FROM hexdump limit 1);
    
        UPDATE users 
        SET image= 
        (
            SELECT decode(hex, 'hex') 
            FROM hexdump LIMIT 1
        )  
        WHERE id=15489 ;
        " | psql mydatabase
    
    • 5
  5. Chloe
    2019-12-20T22:35:48+08:002019-12-20T22:35:48+08:00

    这是在没有超级用户权限的情况下(例如在 Heroku 上)的方法。

    \lo_import '/cygdrive/c/Users/Chloe/Downloads/Contract.pdf'
    update contracts set contract = lo_get(:LASTOID) where id = 77;
    

    您可以使用\lo_list查看大对象并\lo_unlink删除它们。我的示例中的contract字段是bytea.

         Column      |            Type             |
    contract         | bytea                       |
    
    • 0
  6. Gaius
    2011-03-15T12:48:22+08:002011-03-15T12:48:22+08:00

    使用 Postgres复制二进制函数。这大致相当于 Oracle 的外部表。

    • -1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve