Есть приложение на питоне, использует 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, естественно, не предлагать.