【问题标题】:Insert a .txt file into a a postgresql text field将 .text 文件插入到 postgresql 文本字段中
【发布时间】:2014-05-29 14:17:53
【问题描述】:

我需要将包含网络设备配置的 .txt 文件的内容自动放入我定义了文本类型的表格的字段中。 我在WEB上搜索了一下,找到了如下解决方案:

psql -U user -d mydb
\set config = `cat path_to_file/filename`
UPDATE "public"."WebDevice"
SET "Configuration" = :'conf'
WHERE "Description" = 'A00085'
;

这种方法效果很好,但是当我尝试在 shell 脚本中执行相同的操作时,如下所示,我得到一个错误:

#!/bin/sh
count=0
#
DIR_FILE=/home/fvincenti/rete/file
for i in $(ls $DIR_FILE)
 do
 PATH_FILE=$DIR_FILE/$i
 FILE=`echo $i | cut -f1 -d'.'`
 #
 psql -d mydb -U user <<EOF
  \set config = `cat $PATH_FILE`
  UPDATE "public"."WebDevice"
  SET "Configuration" = :'config'
  WHERE "Description" = '$FILE';
 EOF
 let count++
 done
exit 0

错误是: 错误:“!”处或附近的语法错误 第 1 行:! ^ 并且似乎与 \set 指令有关!

如果文件仅包含一行,则脚本运行良好,但在我的情况下,行不止一行,根据 .txt 格式化。 操作系统是 linux Centos 6.0 而 PostgreSQL 是 9.1。

我需要帮助,这种行为让我发疯了! 提前致谢。

弗朗西斯科

【问题讨论】:

  • 尝试在调用psql之前使用shell详细/跟踪:set -vx。如果它变得凌乱,您可以添加set +vx 将其关闭。它将显示将要执行的每个块(原样,没有变量替换),然后前面带有+ 的行表示正在运行的实际cmd,其中变量替换为值。祝你好运。
  • 庇护所,非常感谢您的建议。我试过了,但我只得到以下信息:+ psql -d cmdbsvil -U postgres cat $PATH_FILE ++ cat /home/fvincenti/rete/file/A00085.txt 错误:“!”处或附近的语法错误。没有其他信息;这似乎证实了问题出在 \set meta-command。
  • 哦,我刚刚在您的帖子中注意到这一点“如果文件只包含一行,则脚本运行良好,但在我的情况下,行不止一个,根据 .txt 格式化。”嗯..我得看看那是什么样子。而且我看到您找到了解决方法,因此对此感到非常高兴。 +1 用于解决您自己的问题!

标签: linux postgresql postgresql-9.1 psql


【解决方案1】:

我解决了更改变量而不使用元命令 \set 的问题。 下面是新格式的shell脚本:

#!/bin/sh
count=0
#
DIR_FILE=/home/fvincenti/rete/file
for i in $(ls $DIR_FILE)
do
PATH_FILE=$DIR_FILE/$i
FILE=`echo $i | cut -f1 -d'.'`

CONF_PARAM=`cat $PATH_FILE`

psql -d cmdbsvil -U postgres <<EOF
UPDATE "public"."WebDevice"
SET "Configuration" = '$CONF_PARAM'
WHERE "Description" = '$FILE';
EOF
let count++
done
exit 0

通过这种方式,它可以毫无问题地工作。无论如何,我想知道这可能是导致上一个问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2017-01-10
    相关资源
    最近更新 更多