通过bash脚本将多个csv文件加载到mariadb/mysql

bqujaahr  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(252)

经过一整天的努力,我希望这里有人能帮助我使下面的脚本工作。我结合了多个线程(例如)和网站的信息,但无法让它工作。

我想做的是:

我正在尝试在我的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“权限被拒绝”
而文件夹和文件是所有人的完全访问权限。有人对此有什么想法吗?谢谢!

hkmswyz6

hkmswyz61#

'stock_db.prices'

引用错误。这将起作用,因为它们都不是关键字:

stock_db.prices

这也会起作用:

`stock_db`.`prices`

注意,使用backtics分别引用db名称和表名称。
我无法预测这个噩梦会发生什么:

'"'"'"'
qxsslcnc

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" 有关选项文件的信息。

相关问题