Загрузка нескольких CSV-файлов в MariaDB / MySQL через скрипт bash - PullRequest
0 голосов
/ 05 января 2019

После попытки в течение целого дня, я надеюсь, что кто-то здесь может помочь мне заставить работать нижеприведенный скрипт. Я объединил информацию из нескольких потоков ( пример ) и веб-сайтов, но не могу заставить ее работать.


Что я пытаюсь сделать:

Я пытаюсь получить базу данных MariaDB10 с именем stock_db на моем NAS-устройстве Synology, чтобы загрузить все файлы * .csv из определенной папки (где я сохраняю загруженные исторические цены акций) и добавить их в таблицу, называемую «цены». ». Все файлы одинаково называются "price_history _ ' isin '. Csv". Приведенный ниже оператор SQL работает при отдельном запуске из HeidiSQL на моем компьютере с Windows:

Рабочий 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
;

выпуск

К сожалению, когда я пытаюсь выполнить пакетную загрузку всех CSV-файлов из папки на моем NAS с помощью приведенного ниже сценария, я получаю ту же ошибку.

#!/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_db.prices и упомянул его отдельно как [база данных] вне цитируемого оператора SQL - Не работает
  • Изменены кавычки вокруг stock_db.prices по-разному - не работает
  • Разделил SQL в отдельный файл и сослался на него
  • Рассматривается (или даже предпочтительнее) использование оператора PREPARE, но, похоже, я не могу использовать его в сочетании с LOAD DATA ( reference )

Бонусный вопрос

Если кто-то может помочь мне сделать это без необходимости повторного ввода пароля пользователя или ввода пароля в сценарий, это был бы действительно хороший бонус!


Обновление

Исправлена ​​ошибка «Неправильная база данных» путем добавления опции «-e» Теперь у меня новая ошибка в файлах csv:

ОШИБКА 13 "В доступе отказано"

Пока папки и файлы имеют полный доступ для всех. У кого-нибудь есть мысли по этому поводу? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 06 января 2019
'stock_db.prices'

Неверное цитирование. Это будет работать, поскольку ни одно из них не является ключевым словом:

stock_db.prices

Это также будет работать:

`stock_db`.`prices`

Обратите внимание, что имя БД и имя таблицы заключаются в кавычки отдельно с использованием обратных символов.

Я не могу предсказать, что произойдет с этим кошмаром:

'"'"'"'
0 голосов
/ 05 января 2019
  1. Попробуйте установить базу данных, используя опцию -D: измените первую строку на /volume1/@appstore/MariaDB10/usr/local/mariadb10/bin/mysql -D stock_db -u root -p \ ...

  2. В этой строке может быть ошибка IGNORE INTO TABLE 'stock_db.prices'\ - попробуйте удалить одинарные кавычки.

  3. Создайте файл .my.cnf в домашнем каталоге вашего пользователя и поместите в него следующую информацию: [client] password="my password" Информация о файлах опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...