【发布时间】:2019-01-05 09:33:08
【问题描述】:
尝试了一整天后,我希望这里有人可以帮助我完成以下脚本的工作。我已经结合了来自多个线程 (example) 和网站的信息,但无法使其正常工作。
我想要做什么:
我正在尝试在我的 Synology NAS 上获取名为“stock_db”的 MariaDB10 数据库,以从特定文件夹(我保存下载的股票历史价格的位置)加载所有 *.csv 文件,并将这些文件添加到名为“价格”的表中'。这些文件都被同样命名为“price_history_'isin'.csv”。 下面的 SQL 语句在我的 Windows 机器上从 HeidiSQL 单独运行时有效:
工作 SQL
LOAD DATA LOW_PRIORITY LOCAL INFILE 'D:\\Downloads\\price_history_NL0010366407.csv'
IGNORE INTO TABLE `stock_db`.`prices`
CHARACTER SET utf8
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 2 LINES
(@vdate, @vprice)
SET
isin = 'NL0010366407',
date = STR_TO_DATE(@vdate, '%d-%m-%Y'),
price = @vprice
;
问题
不幸的是,当我尝试通过下面的脚本从我的 NAS 上的一个文件夹中批量加载所有 csv 文件时,我一直收到同样的错误。
#!/bin/bash
for filename in ./price_history/*.csv; do
echo $filename
isin=${filename:30:12}
echo $isin
/volume1/@appstore/MariaDB10/usr/local/mariadb10/bin/mysql -u root -p \
"LOAD DATA LOW_PRIORITY LOCAL INFILE '$filename'\
IGNORE INTO TABLE 'stock_db.prices'\
CHARACTER SET utf8\
FIELDS TERMINATED BY ';'\
OPTIONALLY ENCLOSED BY '"'"'"'\
ESCAPED BY '"'"'"'\
LINES TERMINATED BY '\r\n'\
IGNORE 2 LINES (@vdate, @vprice)\
SET\
isin = '$isin',\
date = STR_TO_DATE(@vdate, '%d-%m-%Y'),\
price = @vprice;"
done
ERROR 1102 (42000):数据库名称不正确
我尝试过的
- 从 stock_db.prices 中取出数据库名称,并在引用的 SQL 语句之外将其作为 [database] 单独提及 - 不起作用
- 以多种不同方式更改了“stock_db.prices”周围的引号 - 不起作用
- 将 SQL 分离到一个单独的文件中并引用它“
- 考虑(甚至首选)使用 PREPARE 语句,但似乎我不能将它与 LOAD DATA 结合使用 (reference)
奖金问题
如果有人可以帮助我做到这一点而无需重新输入用户密码或将密码放入脚本中,这将是非常好的奖励!
更新
通过添加“-e”选项解决了“不正确的数据库错误” 现在我在 csv 文件上有一个新错误:
错误 13“权限被拒绝”
虽然每个人都可以完全访问文件夹和文件。 有人对此有任何想法吗? 非常感谢!
【问题讨论】: