我创建了一个PostgreSQL数据库和表,我希望使用文本文件将数据导入数据库。
我的数据示例:
jameson aa
david bb
piter cc
mat dd
rob ee
此bash可以导入文件,但对于长文件来说速度很慢:
#!/bin/sh
sed 's/ /\',\'/g' file > My_file
while read line; do
psql -d My_db -c "insert into My_table values('$line')"
done < My_file
我也读过这个决心,但是这个导入只是第一个字段中的第一行&amp;不使用分隔符
testdb=> \set content '''' `cat my_file.txt` ''''
testdb=> INSERT INTO my_table VALUES (:content);
答案 0 :(得分:0)
使用\copy
命令。此命令用于从文件导入数据。
\copy my_table from my_file.txt DELIMITER ' '
这很简单,但Postgres非常严格 - 它最后不需要空行,而且字段之间只有一个空格。
注意:您的数据不一致 - 第一行包含字段之间的双倍空格。
回到你的例子。它一定很慢。你确实每一行导入 - 你开始psql和事务的每一行。使用管道和单个事务选项应该快得多。使用awk
,您可以生成SQL脚本:
cat my_file.txt | \
awk -F" " -v Q="'" '{print "INSERT INTO my_table VALUES(" Q$1Q " , " Q$2Q ");" }' | \
psql postgres -1
但是数据中存在丢失转义撇号的风险(与慢速解决方案一样安全)。基于COPY
的解决方案应该更好,100%安全。它强制执行所有必要的内部转义。
testdb=> \set content '''' `cat my_file.txt` ''''
testdb=> INSERT INTO my_table VALUES (:content);
这应该不起作用。 psql
中的SQL语句不支持对数组的批量操作(如ODBC)。您的示例的结果只是无效的INSERT命令。会话变量被评估为字符串替换。您将语句发送到服务器,如:
INSERT INTO my_table VALUES ('Jameson','aa',
'david','bb',
'pitter','cc'
... )
这是无效的。