Added a frist rollback function on a pending Rollback error. (#346)

Possible fix for #341.
Rolls back stuck SQL sessions.
This only helps against the symptomps not the cause.
This commit is contained in:
2023-11-09 20:48:26 +01:00
committed by GitHub
parent 97fc7f01b5
commit 4716eb9fe2

View File

@ -4,14 +4,13 @@ import pandas as pd
import sqlalchemy as sa import sqlalchemy as sa
from cachetools import TTLCache, cached from cachetools import TTLCache, cached
from loguru import logger from loguru import logger
from sqlalchemy.engine import Engine
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from aki_prj23_transparenzregister.utils.sql import entities from aki_prj23_transparenzregister.utils.sql import entities
def get_company_data(session: Session) -> pd.DataFrame: def get_company_data(session: Session) -> pd.DataFrame:
"""Creates a session to the database and get's all available company data. """Creates a session to the database and collects all available company data.
Args: Args:
session: A session connecting to the database. session: A session connecting to the database.
@ -23,14 +22,14 @@ def get_company_data(session: Session) -> pd.DataFrame:
entities.DistrictCourt entities.DistrictCourt
) )
engine = session.bind engine = session.bind
if not isinstance(engine, Engine): if not isinstance(engine, sa.engine.Engine):
raise TypeError raise TypeError
return pd.read_sql(str(query_company), engine, index_col="company_id") return pd.read_sql(str(query_company), engine, index_col="company_id")
def get_person_data(session: Session) -> pd.DataFrame: def get_person_data(session: Session) -> pd.DataFrame:
"""Creates a session to the database and get's all available company data. """Creates a session to the database and collects all available company data.
Args: Args:
session: A session connecting to the database. session: A session connecting to the database.
@ -40,7 +39,7 @@ def get_person_data(session: Session) -> pd.DataFrame:
""" """
query_person = session.query(entities.Person) query_person = session.query(entities.Person)
engine = session.bind engine = session.bind
if not isinstance(engine, Engine): if not isinstance(engine, sa.engine.Engine):
raise TypeError raise TypeError
return pd.read_sql(str(query_person), engine, index_col="person_id") return pd.read_sql(str(query_person), engine, index_col="person_id")
@ -60,7 +59,7 @@ def get_finance_data(session: Session) -> pd.DataFrame:
).join(entities.Company) ).join(entities.Company)
engine = session.bind engine = session.bind
if not isinstance(engine, Engine): if not isinstance(engine, sa.engine.Engine):
raise TypeError raise TypeError
return pd.read_sql(str(query_finance), engine) return pd.read_sql(str(query_finance), engine)
@ -85,9 +84,12 @@ def get_finance_data_of_one_company(session: Session, company_id: int) -> pd.Dat
logger.warning("SQL rollback after operational Error!") logger.warning("SQL rollback after operational Error!")
session.rollback() session.rollback()
annual_finance_data = query.all() annual_finance_data = query.all()
except sa.exc.PendingRollbackError:
logger.warning("SQL rollback when demanded!")
session.rollback()
annual_finance_data = query.all()
engine = session.bind engine = session.bind
if not isinstance(engine, Engine): if not isinstance(engine, sa.engine.Engine):
raise TypeError raise TypeError
data = [row.__dict__ for row in annual_finance_data] data = [row.__dict__ for row in annual_finance_data]