diff options
author | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2014-11-16 22:34:29 +0100 |
---|---|---|
committer | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2014-11-16 22:34:29 +0100 |
commit | 13d310fa14f4e4b9a559f8b7887f2a2492357013 (patch) | |
tree | 4ce6820ef321dceb9b6e1e687534b622e335f444 /factory | |
parent | 827af8f13a1b768a75264874c73cc0e620177262 (diff) | |
download | factory-boy-13d310fa14f4e4b9a559f8b7887f2a2492357013.tar factory-boy-13d310fa14f4e4b9a559f8b7887f2a2492357013.tar.gz |
Remove automagic pk-based sequence setup
Related to issues #78, #92, #103, #111, #153, #170
The default value of all sequences is now 0; the automagic
``_setup_next_sequence`` behavior of Django/SQLAlchemy has been removed.
This feature's only goal was to allow the following scenario:
1. Run a Python script that uses MyFactory.create() a couple of times
(with a unique field based on the sequence counter)
2. Run the same Python script a second time
Without the magical ``_setup_next_sequence``, the Sequence counter would be set
to 0 at the beginning of each script run, so both runs would generate objects
with the same values for the unique field ; thus conflicting and crashing.
The above behavior having only a very limited use and bringing various
issues (hitting the database on ``build()``, problems with non-integer
or composite primary key columns, ...), it has been removed.
It could still be emulated through custom ``_setup_next_sequence``
methods, or by calling ``MyFactory.reset_sequence()``.
Diffstat (limited to 'factory')
-rw-r--r-- | factory/alchemy.py | 12 | ||||
-rw-r--r-- | factory/django.py | 15 |
2 files changed, 0 insertions, 27 deletions
diff --git a/factory/alchemy.py b/factory/alchemy.py index 3c91411..2cd28bb 100644 --- a/factory/alchemy.py +++ b/factory/alchemy.py @@ -44,18 +44,6 @@ class SQLAlchemyModelFactory(base.Factory): }) @classmethod - def _setup_next_sequence(cls, *args, **kwargs): - """Compute the next available PK, based on the 'pk' database field.""" - session = cls._meta.sqlalchemy_session - model = cls._meta.model - pk = getattr(model, model.__mapper__.primary_key[0].name) - max_pk = session.query(max(pk)).one()[0] - if isinstance(max_pk, int): - return max_pk + 1 if max_pk else 1 - else: - return 1 - - @classmethod def _create(cls, model_class, *args, **kwargs): """Create an instance of the model, and save it to the database.""" session = cls._meta.sqlalchemy_session diff --git a/factory/django.py b/factory/django.py index 2b6c463..c58a6e2 100644 --- a/factory/django.py +++ b/factory/django.py @@ -110,21 +110,6 @@ class DjangoModelFactory(base.Factory): return model_class.objects @classmethod - def _setup_next_sequence(cls): - """Compute the next available PK, based on the 'pk' database field.""" - - model = cls._get_model_class() # pylint: disable=E1101 - manager = cls._get_manager(model) - - try: - return 1 + manager.values_list('pk', flat=True - ).order_by('-pk')[0] - except (IndexError, TypeError): - # IndexError: No instance exist yet - # TypeError: pk isn't an integer type - return 1 - - @classmethod def _get_or_create(cls, model_class, *args, **kwargs): """Create an instance of the model through objects.get_or_create.""" manager = cls._get_manager(model_class) |