PostgreSQL批量图像插入

时间:2017-11-08 06:56:55

标签: sql postgresql bulkinsert dynamic-sql

我在一个文件夹中有194个images,我想在PostgreSQL表中上传。我正在使用SQL命令 -

INSERT INTO Uploaded_images (img)
VALUES ( bytea_import('C:\300dpi jpegs\Vintage.jpg'))

如何在一个命令中上传所有图像。

或者有没有其他方法可以将成像插入到表中?

2 个答案:

答案 0 :(得分:2)

在dir结果中循环并使用现有命令插入:

for /r %i in (*) do psql -c "INSERT INTO Uploaded_images (img) VALUES (bytea_import('%i'))"

答案 1 :(得分:0)

将图像文件夹移动到PostgreSQL数据目录*(例如C:/Program Files/PostgreSQL/9.6/data)。

E:\pgData96\imgdir\ - 'E:\pgData96'是我的PostgreSQL数据目录和 'imgdir'包含要插入的图片

* pg_ls_dir

  

仅数据库群集目录和log_directory中的文件   可以访问。使用群集中文件的相对路径   目录,以及与log_directory配置设置匹配的路径   用于日志文件。这些功能的使用仅限于超级用户。

SELECT format('insert into imgs(img) values(bytea_import(''%s''));', ('E:\pgData96\imgdir\' || pg_ls_dir)) a
FROM pg_ls_dir('E:\pgData96\imgdir\');

以上select为文件夹E:\pgData96\imgdir\中的所有图像动态创建插入语句。

实施例

"insert into imgs(img) values(bytea_import('E:\pgData96\imgdir\12.2.17. - 5.png'));"
"insert into imgs(img) values(bytea_import('E:\pgData96\imgdir\15 - 49.png'));"
"insert into imgs(img) values(bytea_import('E:\pgData96\imgdir\16 - 1.png'));"
"insert into imgs(img) values(bytea_import('E:\pgData96\imgdir\16 - 20 (1).png'));"

使用以下SQL脚本

动态执行insert语句
do $$

declare rw record;

begin
    for rw in -- loops through each row in the resultset

    SELECT format('insert into imgs(img) values(bytea_import(''%s''));', ('E:\pgData96\imgdir\' || pg_ls_dir)) a
    FROM pg_ls_dir('E:\pgData96\imgdir\') loop

    execute rw.a; -- executes row(insert statement)
end

loop;end;$$;