我想知道如何将图像“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'));
答案 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工作台-数据库浏览器-插入一行并按照对话框进行操作...