在postgresql数据库中插入图像

时间:2014-03-09 22:13:29

标签: sql database postgresql

我想知道如何将图像“bytea”插入到postgreSql数据库的表中?我一直在搜索论坛几个小时,并且已经看过几十次同样的问题,但还没找到一个答案。我只看到如何将.jpeg插入到一个不是我需要的旧列中。

这是数据库表:

create table category  (
"id_category" SERIAL,
"category_name" TEXT,
"category_image" bytea,
constraint id_cat_pkey primary key ("id_category"))without oids;

当我添加新行时,它不起作用:

insert into category(category_name,category_image) values('tablette', lo_import('D:\image.jpg'));

7 个答案:

答案 0 :(得分:5)

insert into category(category_name,category_image) values('tablette', bytea('D:\image.jpg'));

如果列类型为bytea

,则上述解决方案有效
insert into category(category_name,category_image) values('tablette', lo_import('D:\image.jpg'));

如果列类型为oid,则上述解决方案有效,即Blob

insert into category(category_name,category_image) values('tablette',decode('HexStringOfImage',hex));

上述解码功能有两个参数。第一个参数是Image的HexString。默认情况下,第二个参数是十六进制.Decode函数将hexString转换为字节并存储在postgres中的bytea数据类型列中。

答案 1 :(得分:3)

如果列类型是 bytea,那么您可以简单地使用“pg_read_binary_file”。

示例:pg_read_binary_file('/path-to-image/')

查看 pg_read_binary_file 的 postgresql 文档

答案 2 :(得分:2)

以上示例都不适合我,最重要的是,我需要一次添加许多图像。

完整的工作示例(python 3),并附有说明:

通过get_binary_array,我们将图像(或文件)的值作为二进制数组,使用其路径和文件名作为参数(例如:“ / home / Pictures / blue.png”)。

使用send_files_to_postgresql,我们可以一次发送所有图像。

我之前用一个连续的'id'创建了数据库,该ID将自动递增(但您可以使用自己的自制ID),并使用一个bytea'image'字段

import psycopg2

def get_binary_array(path):
    with open(path, "rb") as image:
        f = image.read()
        b = bytes(f).hex()
        return b

def send_files_to_postgresql(connection, cursor, file_names):
    query = "INSERT INTO table(image) VALUES (decode(%s, 'hex'))"
    mylist = []
    for file_name in file_names:
        mylist.append(get_binary_array(file_name))

    try:
        cursor.executemany(query, mylist)
       
        connection.commit()  # commit the changes to the database is advised for big files, see documentation
        count = cursor.rowcount # check that the images were all successfully added
        print (count, "Records inserted successfully into table")
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)

def get_connection_cursor_tuple():
    connection = None
    try:
        params = config()
        print('Connecting to the PostgreSQL database...')
        connection = psycopg2.connect(**params)
        cursor = connection.cursor()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)

    return connection, cursor

connection, cursor = connect_db.get_connection_cursor_tuple()
img_names = ['./blue.png', './landscape.jpg']
send_files_to_postgresql(connection, cursor, img_names)

答案 3 :(得分:0)

类似该功能(从here稍作修改)的东西可能会解决。

create or replace function img_import(filename text)
  returns void
  volatile
  as $$
    declare
        content_ bytea;
        loid oid;
        lfd integer;
        lsize integer;
    begin
        loid := lo_import(filename);
        lfd := lo_open(loid,131072);
        lsize := lo_lseek(lfd,0,2);
        perform lo_lseek(lfd,0,0);
        content_ := loread(lfd,lsize);
        perform lo_close(lfd);
        perform lo_unlink(loid);

    insert into category values
    ('tablette',
    content_);
    end;
$$ language plpgsql

select * from img_import('D:\image.jpg');一样使用它 或根据需要重写为过程。

答案 4 :(得分:0)

创建以下函数:

categorical_array = np.array_split(categorical,50)

并像这样使用:

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;$$;

答案 5 :(得分:0)

对于 Linux 用户,这是添加图像路径的方法

insert into blog(img) values(bytea('/home/samkb420/Pictures/Sam Pics/sam.png'));

答案 6 :(得分:-1)

使用SQL工作台-数据库浏览器-插入一行并按照对话框进行操作...

enter image description here