如何将 shell 脚本用于 Insert/Update 数据库中的批量 Insert/Update 图像

How to use shell script for Bulk Insert/Update Images in a MySql DB

我有包含图像 (*.jpg) 文件的目录 我有 mysql db 和 table 项目(id、描述、图像)和数据。 我想将图片上传到 table 项中。图像的每个文件名等于 table 项中的每个 ID。如果图像为空,或者图像内容不等于具有相同 ID 的文件内容,则应上传文件。

如何为 MySql 数据库中的批量 Insert/Update 图像使用 shell 脚本? 有人可以提供 shell 脚本的示例代码吗?

您可以在 INSERT 语句中使用 LOAD_FILE() 函数 (http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_load-file),如果您使用用户变量,甚至可以使用 LOAD DATA INFILE

示例:

CREATE TABLE t1 (id int not null primary key, img longblob);
CREATE TABLE t2 (id int not null primary key);
INSERT INTO t2 VALUES (1),(2),(3);
INSERT INTO t1 
SELECT id,LOAD_FILE(CONCAT('/var/www/images/',t2.id,'.jpg')) FROM t2;

该文件需要是全球可读的,用户需要有 FILE 权限,并且该目录可能受到服务器设置 secure_file_priv 的限制。您还需要确保 max_allowed_packed 大于最大文件的大小。

要从目录加载,您可以这样做(经过测试的代码,完整的示例包括 table 为清楚起见创建):

#! /bin/bash

dir=/home/sasha
ext=jpg
chmod a+r $dir/*.$ext
mysql -uroot test <<eot
drop table if exists t1;
create table t1 (name varchar(128), data longblob); 
eot
ls -1 $dir/*.$ext | perl -e 'print "insert into t1(name,data) values ".join(",",map {chop;$f="\"".$_."\""; "($f,load_file($f))"} <>);' | mysql -uroot test

以上代码将 /home/sasha 中扩展名为 jpg 的所有文件加载到 table test.t1.

编辑:解决您对使用 Perl 的担忧。您可以假设 Perl 安装在 Ubuntu 系统上,您有 MySQL 服务器,因为它是 mysql-server-5.5 的依赖项之一(也可能是更新版本)。您可以使用以下命令验证这一点:

dpkg-query -p mysql-server-5.5 | grep Depends

如果这还不够好,您可以改用 Awk 进行解析,但我看不出有什么意义。