LINUX.ORG.RU

шаблон Repository с SQLAlchemy

 , , ,


0

1

Как корректно заюзать Engine и Session из SQLAlchemy для создания репозитория моделей? Нужно ли делать синглтон(ы) для них или пусть каждая модель запускает свой движек и сессию?

Base = declarative_base()
class A(Base):
    ...

class B(Base):
    ...

class Store:

    def __init__(self):
        psql = 'postgresql://user:123@localhost/pdb'
        self.engine = create_engine(psql)
        self.sessionMaker = sessionmaker(bind=self.engine)
        self.sessionMaker = self.sessionMaker()

    def __del__(self):
        self.sessionMaker.commit()
        self.sessionMaker.close_all()    

class AStore(Store):

    def reCreate(self):
        Base.metadata.drop_all(bind=self.engine, tables=[A.__table__])   
        Base.metadata.create_all(self.engine, tables=[A.__table__])  

    def adds(self, rows):     
        for row in rows:
            params = A(**row);
            self.sessionMaker.add(params)
        self.sessionMaker.commit()   

class BStore(Store):
    ...

       Base.metadata.drop_all(bind=self.engine, tables=[A.__table__])   
       Base.metadata.create_all(self.engine, tables=[A.__table__])  

осиль уже sqlalchemy.schema.DropTable и т.п.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Да, спасибо, разберусь …

Но, что по классу Store скажешь?

scientistpython
() автор топика
Ответ на: комментарий от eternal_sorrow

да ладно, может это не Питон путь, но отнаследовался от метакласса Singleton: работает все, подключение проходит один раз к БД

class Store(metaclass=SingletonDB):
    ...

ЗАмечания и предложения с удовольствием послушаю.

scientistpython
() автор топика
Ответ на: комментарий от scientistpython

Ради чего в питоне и правда иногда стоит лепить классы - так это для создания менеджеров контекста. Ознакомься, очень годная вещь. Впрочем и для них не всегда нужны классы, ведь есть @contextmanager.

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Да, спасибо. Я приблизительно то, что нужно соорудил. В доках SQLAlchemy как раз рекомендуется единый контенстный менеджер Session https://docs.sqlalchemy.org/en/14/orm/session_basics.html#when-do-i-construct-a-session-when-do-i-commit-it-and-when-do-i-close-it

scientistpython
() автор топика

Жопа с сессиями начинается когда начинаешь использовать асинхронные фичи из dev версии алхимии. Я так и не понял как их и откуда правильно передавать/создавать, постоянно ошибки что сессия в каком-то не том состоянии.

Ну точнее я как-то заставил это работать, но решил в след раз взять какую-нить tortoiseorm(у peewee асинк версия сильно отставала от обычно когда смотрел последний раз).

pawnhearts ★★★★★
()
Последнее исправление: pawnhearts (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.