psql - (запись | поле) -сепаратор NUL - PullRequest
3 голосов
/ 28 июля 2011

Есть ли способ заставить psql разделить поля и записи на \0, иначе NUL?Это единственный способ передать произвольные данные в сценарии 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

Ответы [ 2 ]

4 голосов
/ 30 июля 2011

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

Обновление : теперь это поддерживается в PostgreSQL 9.2 для будущих версий ( мерзавец ).

1 голос
/ 29 июля 2011

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

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

Редактировать: Возможно, нет. Однако, похоже, что он работает в psql, используя следующие команды:

\f '\000'
\a
...