Как исправить ошибку оболочки синтаксиса bash mysql? - PullRequest
0 голосов
/ 20 февраля 2020

Мне нужен сценарий оболочки для загрузки данных в mysql дБ. Сценарий следующий:

# !bin/bash

qry="DROP TABLE IF EXISTS tmp_x;
    CREATE TEMPORARY TABLE tmp_x AS SELECT * FROM x.y LIMIT 0;
    LOAD DATA INFILE 'path/xxx.csv' 
    INTO TABLE tmp_x 
    FIELDS TERMINATED BY "\," 
    ENCLOSED BY "\""
    LINES TERMINATED BY "\\n"
    IGNORE 1 ROWS;"

mysql --host=xxx --user=xxx --password=xxx db << EOF 
$qry
EOF

Я получаю следующее сообщение об ошибке:

ОШИБКА 1064 (42000) в строке 3: у вас есть ошибка в вашем SQL синтаксис; обратитесь к руководству, соответствующему вашей MySQL версии сервера, чтобы узнать правильный синтаксис для использования рядом с '
ENCLOSED BY "

ЛИНИИ, ПРЕКРАЩЕННЫЕ \ n

IGNORE 1 ROWS 'в строке 3

Я думаю, что это что-то, чтобы избежать какого-то символа, я пытался перейти на одинарные кавычки, но это делает не работает ни.

Я работаю на Ubuntu 18.

Любая помощь будет очень признателен.

Ответы [ 2 ]

4 голосов
/ 20 февраля 2020

Попробуйте:

#!/bin/bash

mysql --host=xxx --user=xxx --password=xxx db << EOF 
    DROP TABLE IF EXISTS tmp_x;
    CREATE TEMPORARY TABLE tmp_x AS SELECT * FROM x.y LIMIT 0;
    LOAD DATA INFILE 'path/xxx.csv' 
    INTO TABLE tmp_x 
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\\n'
    IGNORE 1 ROWS;
EOF

Если вам действительно нужно использовать переменную, вам нужно поиграть в кавычки:

#!/bin/bash

qry="DROP TABLE IF EXISTS tmp_x;
    CREATE TEMPORARY TABLE tmp_x AS SELECT * FROM x.y LIMIT 0;
    LOAD DATA INFILE 'path/xxx.csv' 
    INTO TABLE tmp_x 
    FIELDS TERMINATED BY \",\" 
    ENCLOSED BY \"\\\"\"
    LINES TERMINATED BY \"\\n\"
    IGNORE 1 ROWS;"

mysql --host=xxx --user=xxx --password=xxx db << EOF 
$qry
EOF
1 голос
/ 20 февраля 2020

Может быть проблематично использовать строки в двойных кавычках в SQL, так как вы используете двойные кавычки в качестве разделителя строк в bash. Другими словами, что является двойной кавычкой, заканчивающей строку bash, и которая должна рассматриваться как буквальный символ двойной кавычки в SQL?

. Чтобы решить эту проблему, используйте одинарные кавычки для разделителей строк в SQL.

Еще одна проблема: нет необходимости ставить бэкслу sh перед , для ограничителя поля.

Другая проблема: \n нужен другой backsla sh.

Вот что я пробовал, и похоже, что оно работает:

qry="DROP TABLE IF EXISTS tmp_x;
    CREATE TEMPORARY TABLE tmp_x AS SELECT * FROM x.y LIMIT 0;
    LOAD DATA INFILE 'path/xxx.csv'
    INTO TABLE tmp_x
    FIELDS TERMINATED BY ','
    ENCLOSED BY '\"'
    LINES TERMINATED BY '\\\n'
    IGNORE 1 ROWS;"

Я только напечатал запрос, я не проверял его выполнение.

...