如何在INSERT INTO命令内的单引号中插入变量的内容?

时间:2018-10-26 14:32:32

标签: sql bash postgresql csv

我创建了一个文本文件。它的名称是“ test.txt”,内容在下面的第一部分。我还创建了名称为insert.sh的脚本。 我使用./insert.sh test.txt运行命令。

如果单词/字符串用单引号引起来,它将把单词插入到列中。此外,它将插入没有单引号的数字。我最终将使用的csv将没有单引号,并且我不想更改数据。

如何在INSERT INTO命令中的单引号中插入变量的内容?

我正在使用psql。

文本文件test.txt

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

脚本,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);

更新:

我更改了密码。我按照您的建议在$ 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文件将没有任何引号。

新文本文件。 一,十,百 二,二十,两百

我收到错误消息:

1、2、3

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

1 个答案:

答案 0 :(得分:0)

您需要修改$IFSInternal Field Separator)变量以确定Bash使用的行分隔符。由于您使用的是类似CSV的文件,因此您IFS,个字符,因此,结果就是$IFS=,。请注意,如果您需要在脚本中做其他事情,则需要将$IFS var重新定义为原始状态,因此您需要将其存储在临时变量之前中,类似于$OLDIFS=$IFS

readline读取整行并根据$IFS var来分隔值,因此您需要写出减少量的var,readline将存储单词,即,如果您每行有3个单词,您需要给readline提供3个变量,例如:file:foo,baz,barreadline -r word1 word2 word3。如果您没有提供正确数量的var,readline会将其余单词存储在单个var中,这就是您的问题。

因此,解决您的问题的方法是:

#!/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注入。如果使用此功能,请仅在没有任何有意义的数据的本地数据库中使用。