Элемент распаковки Postgres

#python #postgresql

#python #postgresql

Вопрос:

У меня есть поле в таблице, содержащее упакованные данные, отправленные с устройства lora. Устройство упаковывает его следующим образом:

 # LoRa payload format
# (2 Bytes for device ID, 8 float numbers: temp humid ph1 ph2 ph3 volt1 volt2 volt3)
LORA_PKG_FORMAT = "!Hffffffff"
msg = struct.pack(LORA_PKG_FORMAT, config.DEVICE_ID, temp_read, humid_read, ph1_read, ph2_read, ph3_read, volt1_read, volt2_read, volt3_read)
 

Приложение python на принимающей стороне может декодировать и распаковывать его следующим образом:

 dev_msg = base64.b64decode(rx_pkt["data"])
focus_data = struct.unpack(config.LORA_PKG_FORMAT, dev_msg)
 

Упакованные данные в таблице postgres выглядят следующим образом:

 x000141a4000042a0e3884147fd0f41477c3b4147a5303e0895213e0895213e089521
 

в то время как значения, распакованные из приложения python, являются:

 logging.info('Decoded payload: '   str(focus_data))
 

Декодированная полезная нагрузка: (1, 20.5, 80.44439697265625, 12.499281883239746,
12.467829704284668, 12.477828979492188, 0.13338138163089752, 0.13338138163089752, 0.13338138163089752)

Как я могу добиться того же результата, что и функция struct.unpack, но с помощью запроса postgres? Мне нужно извлечь каждый элемент, чтобы создать панель на grafana.

Комментарии:

1. Как насчет функции базы данных PL / Python?

2. @LaurenzAlbe насколько я понимаю, plpy позволит мне выполнять запросы из скрипта python, верно? Мне нужны данные, декодированные с помощью запроса postgres, потому что это то, что нужно графане

Ответ №1:

Напишите функцию базы данных на PL / Python и вызовите ее в SQL-запросе.

Функции базы данных выполняются внутри базы данных и могут использоваться в SQL.