Как вы можете глобально установить sqlalchemy_session_persistence для фабричного мальчика только в одном месте?

Без добавления MyFlushingModelFactory в качестве базового класса всех моих классов Factory, как я могу установить значение мета-класса sqlalchemy_session_persistence

Я запускаю pytest, и когда машина находится под большой нагрузкой, некоторые из моих тестов не работают с ошибками целостности. Большинство этих проблем можно устранить, просто добавив сбросы в код, связанный с созданием фабричной модели. Но я не хочу добавлять это ко всем моим фабричным классам. Есть ли способ установить значение мета-класса один раз, чтобы оно повлияло на все мои фабрики без дополнительной работы?

# encoding: utf-8
import factory

class MyFlushingModelFactory(factory.alchemy.SQLAlchemyModelFactory):
    class Meta:
        sqlalchemy_session_persistence = factory.alchemy.SESSION_PERSISTENCE_FLUSH

Я хочу установить поведение по умолчанию для SQLAlchemyModelFactory, чтобы сбросить созданный объект на диск как часть вызова .create.


person boatcoder    schedule 01.02.2018    source источник


Ответы (1)


Для нас, кажется, работает базовый класс с переопределенными параметрами:

from factory.alchemy import SQLAlchemyModelFactory

class BaseSQLAlchemyModelFactory(SQLAlchemyModelFactory):
    """Always inherit from here"""

    class Meta:
        abstract = True  # Cannot initialize
        sqlalchemy_session = db.session  # The session object. In our case, this is the flask-sqlalchemy `db` object
        sqlalchemy_session_persistence = 'flush'


class WorkflowFactory(BaseSQLAlchemyModelFactory):
    """Subclass that actually is the factory"""

    class Meta:
        model = MyModel
person kunl    schedule 02.06.2018
comment
Это то, что я тоже должен был сделать, надеялся, что в большой кодовой базе есть что-то менее навязчивое.... - person boatcoder; 03.06.2018
comment
Так что я бы не стал комментировать соглашения и структуру кода, но это должно быть всего лишь одно место, где вы подклассируете и наследуете, верно? Насколько я понимаю, многие проекты в веб-фреймворках делают это. Sentry, например, имеет кучу пользовательских классов. - person kunl; 04.06.2018
comment
Да, но если у вас уже есть пара сотен приборов в проекте, который вы унаследовали, нужно внести много изменений, в то время как установка этого в существующем классе будет одним изменением. - person boatcoder; 04.06.2018
comment
Тогда, может быть, здесь поможет магия метаклассов? Но вам нужно быть осторожным, чтобы переопределить метакласс SQLAlchemyModelFactory, т.е. следовать base.Factory, который является подклассом. Это приведет к изменениям в том, как атрибуты инструментируются в классе метаклассом. Я бы держался немного подальше от этого пути в производственном коде:/ - person kunl; 06.06.2018