经过一整天的努力,我希望这里有人能帮助我使下面的脚本工作。我结合了多个线程(例如)和网站的信息,但无法让它工作。
我想做的是:
我正在尝试在我的synology nas上获取一个名为“stock\u db”的mariadb10数据库,以加载特定文件夹中的所有*.csv文件(保存下载的股票历史价格),并将这些文件添加到名为“prices”的表中。这些文件的名称都是“price\u history\u'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
错误1102(42000):数据库名称不正确
我试过的
从stock\u db.prices中取出数据库名称,并在引用的sql语句之外单独提到它作为[database]——不起作用
改变报价围绕'股票价格'在许多不同的方式-不起作用
将sql分离到一个单独的文件中,并引用它“<stmt.sql”-使事情更加复杂,根本无法让它工作(尽管可能是首选)
考虑使用prepare语句(甚至是首选),但似乎我不能将其与load data(reference)结合使用
奖金问题
如果有人能帮我做到这一点,而不必重新输入用户的密码或把密码在脚本中,这将是非常好的奖金!
更新
通过添加“-e”选项解决了“不正确的数据库错误”现在我在csv文件上有一个新错误:
错误13“权限被拒绝”
而文件夹和文件是所有人的完全访问权限。有人对此有什么想法吗?谢谢!
2条答案
按热度按时间hkmswyz61#
引用错误。这将起作用,因为它们都不是关键字:
这也会起作用:
注意,使用backtics分别引用db名称和表名称。
我无法预测这个噩梦会发生什么:
qxsslcnc2#
尝试使用-d选项设置数据库:将第一行更改为
/volume1/@appstore/MariaDB10/usr/local/mariadb10/bin/mysql -D stock_db -u root -p \ ...
这行可能有错误IGNORE INTO TABLE 'stock_db.prices'\
-尝试删除单引号。在用户的主目录中创建文件.my.cnf,并将以下信息放入其中:
[client] password="my password"
有关选项文件的信息。