加载数据infile参数化

时间:2017-08-16 09:52:34

标签: linux shell mariadb

我需要在linux环境中将平面文件中的数据加载到mariaDB中。 我打算将mariaDB脚本放在shell文件中。然后从cron调用shell。

mariadb脚本如下所示:

set @path = (select path_file from param);

set @tbl = (select table_name from param);

set @x = concat(
            'LOAD DATA LOCAL INFILE ',
             @path,
            ' INTO TABLE ', @tbl,
           ' (@row) set id = trim(substr(@row,1,2)), name = trim(substr(@row,3,19)), address= trim(substr(@row,22,20))'
            );

prepare y from @x;

execute y;

deallocate prepare y;

当我直接在heidisql上执行脚本时, 错误显示:

this command is not supported in the prepared statement protocol yet

是否有人有更好的方法在不使用任何ETL工具的情况下定期(预定)在linux环境中将数据从平面文件加载到MariaDB中?

感谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试的一个选项是(根据需要调整):

档案:load_data.sh

path=$(mysql -u ${mysql_user} -p${mysql_password} -s -N <<GET_PATH
  SELECT '/path/to/file/data.csv';
GET_PATH
)

tbl=$(mysql -u ${mysql_user} -p${mysql_password} -s -N <<GET_TABLE
  SELECT 'table';
GET_TABLE
)

# mysql -u ${mysql_user} -p${mysql_password} -s -N <<LOAD_DATA
#   LOAD DATA LOCAL INFILE '${path}'
#   INTO TABLE \`${tbl}\` ...
# LOAD_DATA

# TEST
cat <<LOAD_DATA
  LOAD DATA LOCAL INFILE '${path}'
  INTO TABLE \`${tbl}\` ...
LOAD_DATA

命令行:

$ ls -l
-r-x------ load_data.sh

$ ./load_data.sh 
LOAD DATA LOCAL INFILE '/path/to/file/data.csv'
INTO TABLE `table` ...

答案 1 :(得分:0)

为清楚起见,将尽可能多的SQL写入STORED PROCEDURE然后使用bash来调用该SP。