db refactoring, one and many

This commit is contained in:
Wolfgang Hottgenroth 2021-07-02 14:52:07 +02:00
parent 32a66dc189
commit daca7eca9b
Signed by: wn
GPG Key ID: 6C1E5E531E0D5D7F
3 changed files with 82 additions and 18 deletions

View File

@ -1,17 +1,8 @@
from db import execDatabaseOperation
from loguru import logger
import json
def _opGetAccounts(cursor, params):
accounts = []
cursor.execute('SELECT id, description FROM account_t')
for accountObj in cursor:
logger.debug("add account {} -> {}".format(accountObj[0], accountObj[1]))
accounts.append({"id": accountObj[0], "description": accountObj[1]})
return accounts
from db import dbGetMany, dbGetOne
def getAccounts(user, token_info):
logger.info("getAccounts, token: {}".format(json.dumps(token_info)))
return execDatabaseOperation(_opGetAccounts, ())
return dbGetMany(user, token_info, {"statement": "SELECT id, description FROM account_t", "params": ()})
def getAccount(user, token_info, accountId=None):
return dbGetOne(user, token_info, {"statement": "select id, description from account_t where id = %s", "params": (accountId, )})

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

View File

@ -42,6 +42,28 @@ paths:
$ref: '#/components/schemas/Account'
security:
- jwt: ['secret']
/v1/accounts/{accountId}:
get:
tags: [ "Account" ]
summary: Return the normalized account with given id
operationId: account.getAccount
parameters:
- name: accountId
in: path
required: true
schema:
type: integer
responses:
'200':
description: accounts response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/Account'
security:
- jwt: ['secret']
components:
securitySchemes: