【发布时间】:2011-07-28 10:10:18
【问题描述】:
有没有办法让psql 用\0 分隔字段和记录,也就是NUL?这是能够将任意数据传递给 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
【问题讨论】:
标签: bash postgresql nul