powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Запрос на вставку данных из bash в postgresql через psql
5 сообщений из 5, страница 1 из 1
Запрос на вставку данных из bash в postgresql через psql
    #39784525
fortress
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня

Имеется утилита, которая выводит показания датчиков температуры. Нужно раз в полчаса сохранять показания этих датчиков в базу данных.
Вывод утилиты:
ID: 6122 - Измерение температуры...
Измерение температуры завершено
ROM=8d00000ae4f4b028 T=51.0625
ROM=2600000ae2cb2b28 T=61.9375
ROM=be00000ae4ba1f28 T=44.9375
ROM=2100000ae4838c28 T=78.0625
Для осуществления задуманного был придуман следующий скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#!/bin/bash
IFS=$'\n'
dt=$(date '+%d.%m.%Y %T')
d='postgresql://temp:temp@10.15.23.2/temp -c '
v='INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VALUES '
first_values=1
for s in `sed '1,2 d; s/ROM=//; s/T=//' test_output`; do
        rom=`echo $s | cut -d' ' -f1`
        temp=`echo $s | cut -d' ' -f2`
        if [[ $first_values = 1 ]];
        then
                v=$v"('$dt',x'$rom'::int8,$temp)"
                first_values=0
        else
                v=$v",('$dt',x'$rom'::int8,$temp)"
        fi
done
echo psql $d"\"$v\""
psql $d"\"$v\""

который при запуске выдаёт ошибку:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
pi@dietpi:~/term $ ./insert_temp0.sh
psql postgresql://temp:temp@10.15.20.3/temp -c "INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VALUES 
('11.03.2019 15:06:09',x'8d00000ae4f4b028'::int8,51.0625),
('11.03.2019 15:06:09',x'2600000ae2cb2b28'::int8,61.9375),
('11.03.2019 15:06:09',x'be00000ae4ba1f28'::int8,44.9375),
('11.03.2019 15:06:09',x'2100000ae4838c28'::int8,78.0625)"
psql: FATAL:  no pg_hba.conf entry for host "192.168.0.46", user "temp", database "temp -c "INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VAL", SSL on
FATAL:  no pg_hba.conf entry for host "192.168.0.46", user "temp", database "counters2 -c "INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VAL", SSL off

Похоже где-то есть ошибка, из-за которой psql не может распарсить аргументы. Возможно, проблема с раскрытием переменных?
Если изменить последнюю строчку на такую (навеяно этим ):
Код: sql
1.
psql postgresql://temp:temp@10.15.20.3/counters2 -c "$v"

то всё работает, запрос выполняется, данные вставляются.

Как всё-таки правильно вызвать psql из bash, передав ему в качестве параметров значения переменных?
...
Рейтинг: 0 / 0
Запрос на вставку данных из bash в postgresql через psql
    #39785098
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
pgsql@webdb1:~$ truss -DEdfael ./test.sh

Первый вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
...
12574/1:         0.084318     0.000738     0.000743    execve("/opt/k2b/bin/psql", 0x08E08848, 0x08E09808)   argc = 2 
12574/1:         argv: psql
12574/1:          postgresql://user:password@localhost/db -c "INSERT INTO temp_t(t_date, t_rom, t_temp) VALUES ('12.03.2019 22:45:19',x'8d00000ae4f4b028'::int8,51.0625),('12.03.2019 22:45:19',x'2600000ae2cb2b28'::int8,61.9375)"
12574/1:         envp: LC_ALL= LC_MONETARY= LANG=en_US.UTF-8 TZ=localtime HZ=
...
: 12574/1:       0.238801     0.000052     0.000009    write(2, " :  ", 2)                              = 2
FATAL:  database "db -c "INSERT INTO temp_t(t_date, t_rom, t_temp) VALUES ('1" does not exist

Второй вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
12577/1:         0.244152     0.000781     0.000786    execve("/opt/k2b/bin/psql", 0x08E0BCC8, 0x08E09808)   argc = 4 
12577/1:         argv: psql postgresql://user:password@localhost/db
12577/1:          -c
12577/1:          INSERT INTO temp_t(t_date, t_rom, t_temp) VALUES ('12.03.2019 22:45:19',x'8d00000ae4f4b028'::int8,51.0625),('12.03.2019 22:45:19',x'2600000ae2cb2b28'::int8,61.9375)
12577/1:         envp: LC_ALL= LC_MONETARY= LANG=en_US.UTF-8 TZ=localtime HZ=
...
12577/1:         0.427641     0.000023     0.000008    fstat(1, 0xFFFF80FFBFFFE320)                     = 0
INSERT 0 2
...
Рейтинг: 0 / 0
Запрос на вставку данных из bash в postgresql через psql
    #39785165
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortressКак всё-таки правильно вызвать psql из bash, передав ему в качестве параметров значения переменных?параметры не нужны.

Код: sql
1.
2.
3.
psql ... <<__EOF__
insert into ...
__EOF__
...
Рейтинг: 0 / 0
Запрос на вставку данных из bash в postgresql через psql
    #39790032
fortress
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Scott Tiger,
Спасибо за ответ. Для моей системы (armbian) такого инструмента как truss не нашлось, но есть strace в котором можно увидеть вызов execve c параметрами.
Пробуем вариант 1, как было в исходном скрипте.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
d='postgresql://temp:temp@192.168.105.5/counters -c'
v=' INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VALUES '
...
psql $d "\"$v\""
...
[pid 18040] execve("/usr/bin/psql", [
"psql", 
"postgresql://temp:temp@192.168.105.5/counters -c", 
"\" INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VALUES...
...
psql: FATAL:  no pg_hba.conf entry for host "192.168.3.46", user "temp", database "counters -c", SSL on
FATAL:  no pg_hba.conf entry for host "192.168.3.46", user "temp", database "counters -c", SSL off

psql вызывается с 2 аргументами - строка подключения и запрос. Но из-за того что ключ "-c" попадает в первый параметр, видимо он считается как часть имени базы данных, что приводит к ошибке подключения.
Пробуем вариант 2, убрали лишние двойные кавычки возле второго аргмуента.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
d='postgresql://temp:temp@192.168.105.5/counters -c'
v=' INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VALUES '
...
psql $d "$v"
...
[pid 17856] execve("/usr/bin/psql", ["psql",
"postgresql://temp:temp@192.168.105.5/counters -c", 
" INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VALUES ...
...
psql: FATAL:  no pg_hba.conf entry for host "192.168.3.46", user "temp", database "counters -c", SSL on
FATAL:  no pg_hba.conf entry for host "192.168.3.46", user "temp", database "counters -c", SSL off

Ситуация не изменилась, просто видно что вторая пара кавычек не нужна.
Тогда просто перенесём ключ "-с" в другую переменную:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
d='postgresql://temp:temp@192.168.105.5/counters'
v='-с INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VALUES '
...
psql $d "$v"
...
[pid 21269] execve("/usr/bin/psql", [
"psql", 
"postgresql://temp:temp@192.168.105.5/counters",
"-c INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VALUES...
...
INSERT 0 4

В этом случае всё работает как ожидалось.
Также, оказалось важно чтобы в переменной v, перед ключом "-с", не было пробелов, иначе дальнейшая команда не воспринимается.

Изначально я полагал, что
Код: sql
1.
psql $d $v

будет преобразовано в строку вида
Код: sql
1.
pslq postgresql://temp:temp@192.168.105.5/counters -c "INSERT INTO ..."

и при вызове psql ей будут переданы параметры из этой строки, например так
Код: sql
1.
2.
3.
4.
0 - psql
1 - postgresql://temp:temp@192.168.105.5/counters
2 - -c
3 - "INSERT INTO ..."

Но, как видно выше, при раскрытии переменных bash(?) ведет себя по-другому (объединяя значение переменной в 1 параметр, даже если там есть пробелы):
Код: sql
1.
2.
3.
0 - psql
1 - postgresql://temp:temp@192.168.105.5/counters
2 - -c "INSERT INTO ..."

Наверняка это как-то правильно называется (раскрытие переменных?).
...
Рейтинг: 0 / 0
Запрос на вставку данных из bash в postgresql через psql
    #39790037
fortress
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов, спасибо
Такой способ тоже подходит:
Код: sql
1.
2.
3.
4.
5.
6.
d='postgresql://temp:temp@localhost/counters'
v='INSERT INTO cnt.temp_t(t_date, t_rom, t_temp) VALUES '
...
psql $d <<EOF
$v
EOF
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Запрос на вставку данных из bash в postgresql через psql
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]