【问题标题】:How to use shell script for Bulk Insert/Update Images in a MySql DB如何在 MySql 数据库中使用 shell 脚本批量插入/更新图像
【发布时间】:2015-12-02 17:28:06
【问题描述】:

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

如何在 MySql 数据库中使用 shell 脚本批量插入/更新图像? 有人能提供shell脚本的示例代码吗?

【问题讨论】:

    标签: mysql shell blob bulkinsert


    【解决方案1】:

    您可以在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 大于您最大文件的大小。

    要从目录加载,您可以执行以下操作(经过测试的代码,完整示例,包括为清楚起见创建表):

    #! /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的文件加载到表test.t1中。

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

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

    如果这还不够好,您可以使用 awk 来代替解析,但我看不出有什么意义。

    【讨论】:

    • 我想将所有文件从目录加载到数据库中。
    • 我不想使用 perl、php、java 等。我只想使用 ubuntu shell + mysql。
    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多