rewrite: New data ORM.

This commit is contained in:
2022-11-02 07:23:51 +02:00
parent a5147323b5
commit 069c032e02
15 changed files with 1542 additions and 717 deletions

View File

@@ -1,30 +1,42 @@
import logging
from psycopg2.extras import DictCursor, _ext
from typing import Optional
from meta import log
from psycopg import AsyncCursor, sql
from psycopg.abc import Query, Params
from psycopg._encodings import pgconn_encoding
logger = logging.getLogger(__name__)
class DictLoggingCursor(DictCursor):
def log(self):
msg = self.query
if isinstance(msg, bytes):
msg = msg.decode(_ext.encodings[self.connection.encoding], 'replace')
class AsyncLoggingCursor(AsyncCursor):
def mogrify_query(self, query: Query):
if isinstance(query, str):
msg = query
elif isinstance(query, (sql.SQL, sql.Composed)):
msg = query.as_string(self)
elif isinstance(query, bytes):
msg = query.decode(pgconn_encoding(self._conn.pgconn), 'replace')
else:
msg = repr(query)
return msg
log(
msg,
context="DATABASE_QUERY",
level=logging.DEBUG,
post=False
)
def execute(self, query, vars=None):
async def execute(self, query: Query, params: Optional[Params] = None, **kwargs):
if logging.DEBUG >= logger.getEffectiveLevel():
msg = self.mogrify_query(query)
logger.debug(
"Executing query (%s) with values %s", msg, params,
extra={'action': "Query Execute"}
)
try:
return super().execute(query, vars)
finally:
self.log()
def callproc(self, procname, vars=None):
try:
return super().callproc(procname, vars)
finally:
self.log()
return await super().execute(query, params=params, **kwargs)
except Exception:
msg = self.mogrify_query(query)
logger.exception(
"Exception during query execution. Query (%s) with parameters %s.",
msg, params,
extra={'action': "Query Execute"},
stack_info=True
)
else:
# TODO: Possibly log execution time
pass