db refactoring, one and many

This commit is contained in:
2021-07-02 14:52:07 +02:00
parent 32a66dc189
commit daca7eca9b
3 changed files with 82 additions and 18 deletions

57
db.py
View File

@ -1,7 +1,10 @@
import psycopg2
import psycopg2.extras
from loguru import logger
import os
import configparser
import json
import werkzeug
@ -22,7 +25,11 @@ except KeyError:
DB_HOST = config["database"]["host"]
DB_NAME = config["database"]["name"]
logger.info(f"db config: {DB_USER}, {DB_NAME}, {DB_HOST}, {DB_PASS}")
class NoDataFoundException(Exception): pass
class TooMuchDataFoundException(Exception): pass
def databaseOperation(cursor, params):
@ -38,10 +45,11 @@ def execDatabaseOperation(func, params):
cur = None
try:
conn = psycopg2.connect(user = DB_USER, password = DB_PASS,
host = DB_HOST, database = DB_NAME)
host = DB_HOST, database = DB_NAME,
sslmode = 'require')
conn.autocommit = False
with conn.cursor() as cur:
with conn.cursor(cursor_factory = psycopg2.extras.RealDictCursor) as cur:
return func(cur, params)
except psycopg2.Error as err:
raise Exception("Error when connecting to database: {}".format(err))
@ -50,3 +58,46 @@ def execDatabaseOperation(func, params):
conn.close()
def _opGetMany(cursor, params):
items = []
cursor.execute(params["statement"])
for itemObj in cursor:
logger.debug("item received {}".format(str(itemObj)))
items.append(itemObj)
return items
def dbGetMany(user, token_info, params):
logger.info("params: {}, token: {}".format(params, json.dumps(token_info)))
try:
return execDatabaseOperation(_opGetMany, params)
except Exception as e:
logger.error(f"Exception: {e}")
raise werkzeug.exceptions.InternalServerError
def _opGetOne(cursor, params):
cursor.execute(params["statement"], params["params"])
itemObj = cursor.fetchone()
logger.debug(f"item received: {itemObj}")
if not itemObj:
raise NoDataFoundException
dummyObj = cursor.fetchone()
if dummyObj:
raise TooMuchDataFoundException
return itemObj
def dbGetOne(user, token_info, params):
logger.info("params: {}, token: {}".format(params, json.dumps(token_info)))
try:
return execDatabaseOperation(_opGetOne, params)
except NoDataFoundException:
logger.error("no data found")
raise werkzeug.exceptions.NotFound
except TooMuchDataFoundException:
logger.error("too much data found")
raise werkzeug.exceptions.InternalServerError
except Exception as e:
logger.error(f"Exception: {e}")
raise werkzeug.exceptions.InternalServerError