5

有什么方法可以通过aka NUL来psql分隔字段和记录吗?\0这是能够将任意数据传递给 Bash 脚本的唯一方法。

根据Matthew Wood的回答,我希望这会1在新初始化的数据库上打印更多内容:

declare -i count=0
echo "\pset recordsep '\000'
\f '\000'
select typname from pg_type" | \
sudo -iu postgres psql --no-align --quiet --tuples-only -d dbname -U username | while IFS= read -r -d ''
do
    #echo "$REPLY"
    let count++
done
if [ -n "$REPLY" ]
then
    #echo "$REPLY"
    let count++
fi
echo $count

解决方法:如果SELECT结果是唯一的,您可以使用此解决方法一次处理一个:

next_record() {
    psql --no-align --quiet --tuples-only -d dbname -U username <<SQL
SELECT colname
  FROM tablename
 WHERE colname > '${1}'
 ORDER BY colname
 LIMIT 1
SQL
}

last_col=
while true
do
    colx="$(next_record "$last_col"; printf x)"
    if [ "$colx" = x ]
    then
        exit
    fi
    col="${colx%$'\nx'}" # The extra \n character is from psql

    # Do your thing here

    col_escaped="${col//"'"/''}" # Double single quotes
    col_escaped="${col_escaped//\\/\\\\}" # Double backslashes
    last_col="$col_escaped"
done
4

3 回答 3

4

这是不支持的。psql 使用 C 打印函数来打印结果表,并且打印零字节在那里不起作用。

更新: PostgreSQL 9.2-to-be ( git )现在支持这一点。

于 2011-07-30T06:37:40.253 回答
1

试试这个:

psql --field-separator '\000' --no-align -c '<your query>'

编辑:也许不是。但是,它似乎可以使用以下命令在 psql 中工作:

\f '\000'
\a
于 2011-07-29T00:08:17.967 回答
0

较新版本的支持psql 标志--field-separator-zero

于 2021-05-07T11:36:39.290 回答