psql - (запись | поле)-сепаратор NUL

Есть ли способ сделать psql разделите поля и записи \0ака нул? Это единственный способ передавать произвольные данные в сценарии Bash.

Исходя из ответа Мэтью Вуда, я ожидал, что это напечатает больше 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

3 ответа

Решение

Это не поддерживается psql использует функции печати C для распечатки таблиц результатов, и печать нулевого байта просто не работает там.

Обновление: теперь это поддерживается в PostgreSQL 9.2 ( git).

Попробуй это:

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

Редактировать: возможно нет. Тем не менее, похоже, что он работает в psql с помощью этих команд:

\f '\000'
\a

Более новые версии psql поддержка--field-separator-zero флаг.

Другие вопросы по тегам