在postgresql中添加到bytea blob的函数

时间:2013-12-24 08:04:56

标签: c# sql postgresql blobs

我将大量文件(二进制数据)加载到Postgres数据库中(文件存储为数据库中的blob)。

我发现的一种方法是使用大对象,它很好用。但是,出于各种原因,我想探索将文件内容直接存储在bytea字段中的可能性。 现在,大对象管理器允许我直接将字节块直接写入其缓冲区,从而无需首先将整个文件加载到内存中。

这对我来说非常重要,因为我正在加载具有多个并行工作线程的文件(如果所有线程同时将整个文件加载到内存中,GC就无法跟上)。

有没有办法用bytea参数做到这一点?我在想一个SQL函数,它将一块字节附加到一行的bytea字段。然后我可以重复调用这个函数为blob。我对PostgreSQL很新,所以我真的可以提示这样的SQL函数是什么样的。

那么,我如何在PostgreSQL中附加到bytea blob?

顺便说一句,其他想法也很受欢迎。

我使用PostgreSQL 9.3,C#(.NET 4)和NpgSql Postgres数据提供程序,文件(blob)可以是从几kb到几mb的所有内容。

编辑:我已经看到对byteacat函数的引用,看起来很有希望,但我找不到如何使用它的示例。

Edit2:最后,在查询中将blob加载为单个参数似乎是最简单的...只要确保它们足够快地进行垃圾收集(例如,不使字节数组成为对象的属性)。 Postgresql非常好地处理数据!

1 个答案:

答案 0 :(得分:0)

编辑:DanielVérité是对的,这会变得混乱(并在一段时间后大幅减速), 我不会推荐此路径。

好的,这很简单:

有一个||附加二进制数据的运算符......示例:

UPDATE TableWithBlob SET blob = blob || E'123\\000456' WHERE id = 'a356211f-1cb7-436d-80a8-7e608ffds0';

或者作为参数化SQL查询(使用NpgSQL数据提供程序时):

UPDATE TableWithBlob SET blob = blob || @Data WHERE ID = @ID;