agreg-server/app/consumer/src/adapters/postgres.py

57 lines
1.6 KiB
Python
Raw Normal View History

import logging
import time
import psycopg2
from psycopg2.extensions import connection
from ports import DeviceRepository, ReadingRepository
log = logging.getLogger(__name__)
def connect(uri: str) -> connection:
for _ in range(10):
try:
conn = psycopg2.connect(uri)
conn.autocommit = True
log.info("PostgreSQL connecté")
return conn
except Exception as e:
log.warning("Attente PostgreSQL... (%s)", e)
time.sleep(3)
raise RuntimeError("Impossible de se connecter à PostgreSQL")
class PgDeviceRepository(DeviceRepository):
def __init__(self, conn: connection):
self._conn = conn
def get_or_create_device_id(self, dev_eui: str) -> str:
with self._conn.cursor() as cur:
cur.execute(
"""
INSERT INTO device (device_eui)
VALUES (%s)
ON CONFLICT (device_eui) DO NOTHING
""",
(dev_eui,),
)
cur.execute(
"SELECT device_id FROM device WHERE device_eui = %s", (dev_eui,)
)
return str(cur.fetchone()[0])
class PgReadingRepository(ReadingRepository):
def __init__(self, conn: connection):
self._conn = conn
def insert_reading(self, device_id: str, pulse_count: int) -> None:
with self._conn.cursor() as cur:
cur.execute(
"""
INSERT INTO reading (device_id, date, pulses)
VALUES (%s, NOW(), %s)
""",
(device_id, pulse_count),
)