Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL导入文本文件_Sql_Bash_Postgresql - Fatal编程技术网

PostgreSQL导入文本文件

PostgreSQL导入文本文件,sql,bash,postgresql,Sql,Bash,Postgresql,我创建了一个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 <

我创建了一个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
使用命令。此命令用于从文件导入数据

\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
但是,数据中可能存在丢失转义撇号的风险(它与您的慢速解决方案一样安全)<基于代码>复制的解决方案应该更好,而且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'
... )

这是无效的。

我的文件没有任何空行,排列方式与编辑的示例双音空间完全相同。很遗憾,我可以使用您的代码进行更多解释吗?Tnx pavel,您的指导非常有用。
INSERT INTO my_table VALUES ('Jameson','aa',
'david','bb',
'pitter','cc'
... )