Files
cardio/db.py

66 lines
2.1 KiB
Python

import os
import psycopg2
from psycopg2.extras import RealDictCursor
from urllib.parse import urlparse
class DataBase():
def __init__(self, app):
db_url = urlparse(os.environ['DATABASE_URL'])
self.conn = psycopg2.connect(
database=db_url.path[1:],
user=db_url.username,
password=db_url.password,
host=db_url.hostname,
port=db_url.port
)
def execute(self, query, args=(), one=False, commit=False):
cur = self.conn.cursor(cursor_factory=RealDictCursor)
try:
cur.execute(query, args)
except:
self.conn.rollback()
raise Exception('Rolling back transaction...')
rv = None
if cur.description is not None:
rv = cur.fetchall()
if commit:
try:
self.conn.commit()
except:
self.conn.rollback()
cur.close()
return (rv[0] if rv else None) if one else rv
def insert_cadence(self, rpm, device_id):
self.execute('INSERT INTO cadence (rpm, device_id) VALUES (%s, %s)',
[rpm, device_id], commit=True)
def get_all_cadences(self, device_id):
return self.execute("""SELECT LOGGED_AT, RPM FROM cadence WHERE device_id = %s AND (NOW() < (LOGGED_AT + (INTERVAL '3 hour'))) LIMIT 100""", [device_id])
def get_devices(self):
return self.execute("""
SELECT DEVICE.ID,
DEVICE.NAME,
MAX(CADENCE.LOGGED_AT) AS LAST_LOGGED_AT,
CASE WHEN(NOW() < (MAX(CADENCE.LOGGED_AT) + (INTERVAL '5 min'))) THEN 'yes'
ELSE 'no'
END AS IS_ACTIVE
FROM DEVICE
LEFT JOIN CADENCE ON DEVICE.ID = CADENCE.DEVICE_ID
GROUP BY DEVICE.ID
ORDER BY LAST_LOGGED_AT
""")
def get_device(self, device_id):
return self.execute('SELECT * FROM device WHERE id = %s', [device_id], one=True)
def insert_cadence(self, rpm, device_id):
self.execute('INSERT INTO cadence (rpm, device_id) VALUES (%s, %s)',
[rpm, device_id], commit=True)