Как вставить содержимое переменной в одинарные кавычки внутри команды INSERT INTO? - PullRequest
0 голосов
/ 26 октября 2018

Я создал текстовый файл. Название этого файла - «test.txt», а содержание - первая часть ниже. Я также создал скрипт с именем insert.sh. Я запускаю команду с ./insert.sh test.txt.

Если слова / строки заключены в одинарные кавычки, слова будут вставлены в столбцы. Также он будет вставлять числа без одинарных кавычек. У CSV, который я в конечном итоге буду использовать, не будет одинарных кавычек, и я не хочу менять данные

Как вставить содержимое переменной в одинарные кавычки внутри команды INSERT INTO?

Я использую PSQL.

Текстовый файл, test.txt

'one','ten','hundred'
'two','twenty','twohundred'

Script, insert.sh:

#!/bin/bash
while read cell
do
    name=$cell
    echo "$cell"

####Insert from txt into table####
sudo -u username -H -- psql -d insert_test -c "
INSERT INTO first (ten, hundred, thousend) VALUES ($cell);
"
done < $1

как то так:

INSERT INTO first (ten, hundred, thousend) VALUES (INSERT" $cell "QUOTES);

UPDATE:

Я изменил код. Я добавил одинарные кавычки вокруг $ cell, как вы и предлагали.

#!/bin/bash
while read cell
do
    name=$cell
    echo "$cell"

####Insert from txt into table####
sudo -u username -H -- psql -d insert_test -c "
INSERT INTO first (ten, hundred, thousend) VALUES ('$cell');
"
done < $1

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

новый текстовый файл. один, десять, сто два, двадцать, twohundred

и я получаю ошибку:

один, два, три

ERROR:  INSERT has more target columns than expressions
LINE 2: INSERT INTO first (ten, hundred, thousend) VALUES ('one,two,...

1 Ответ

0 голосов
/ 26 октября 2018

Вам необходимо изменить переменную $IFS ( Внутренний разделитель полей ), чтобы определить разделитель строк, используемый Bash. Так как вы использовали CSV-подобный файл, вы IFS получаете , символ, таким образом, это результат $IFS=,. Обратите внимание, что если вам нужно делать другие вещи в вашем скрипте, вам нужно переопределить переменную $IFS к исходному состоянию, поэтому вам нужно сохранить ее во временной переменной до того, как вы ее измените, что-то вроде $OLDIFS=$IFS.

readline прочитайте всю строку и разделите значения в зависимости от $IFS var, таким образом, вам нужно записать приведенное количество var, где readline будет хранить слова, т. Е. Если в строке 3 слова, вы нужно указать 3 переменные для readline, например: file: foo,baz,bar, readline -r word1 word2 word3. Если вы не дадите правильное количество переменных, readline сохранит остальную часть слова в одной переменной, это ваша проблема.

Итак, решение вашей проблемы было бы:

#!/bin/bash
$OLDIFS=$IFS # If you need to do more stuff.

while IFS=, read -r word1 word2 word3
do
  sudo -u username -H -- psql -d insert_test -c
  "INSERT INTO first (ten, hundred, thousend) VALUES (${word1}, ${word2}, ${word3});"
done < $1

$IFS=$OLDIFS # Same of line 2.
# ...

ПРИМЕЧАНИЕ : Это небезопасно , так как легко приводит к внедрению SQL. Если вы используете это, используйте только в локальной базе данных, которая не имеет никаких чувствительных данных.

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