Есть приложение на питоне, использует psycopg.
Есть класс для работы с базой, который инкапсулирует весь SQL код и предоставляет API. В частности, там есть метод для создания схемы, есть методы для чтения и записи определённых данных в/из базу. Условно это выглядит как-то так:
class Database:
    def __init__(self, dsn):
        self.db = psycopg2.connect(dsn)
    def CreateSchema(self):
        self.db.cursor().execute("CREATE TABLE foo ...")
        ...
    def GetFoo(self, id):
        cur = self.db.cursor()
        cur.execute("SELECT...JOIN...JOIN...FROM SELECT(...)...GROUP BY...ORDER BY)
        return [ MyFooObject(a=row[0], b=row[1], c=row[2] for row in cur.fetchall() ]
Этот класс уже разросся на несколько тысяч строк, поскольку методов API накопилось много, посему вопрос: какие best practices есть по разбивке его на небольшие части? Навскидку придумывается только что-то такое:
class FooAPI:
    def __init__(self, db):
        self.db = db
    def Get(self, id):
        self.db.cursor()
        cur.execute("SELECT...JOIN...JOIN...FROM SELECT(...)...GROUP BY...ORDER BY")
        return [ MyFooObject(a=row[0], b=row[1], c=row[2] for row in cur.fetchall() ]
class Database:
    def __init__(self, dsn):
        self.db = psycopg2.connect(dsn)
    def GetFooAPI(self):
        return FooAPI(db)
но как-то это топорно.
PS. ORM, естественно, не предлагать.


