def diff_many(models1, models2, migrator=None, reverse=False): """Calculate changes for migrations from models2 to models1.""" models1 = pw.sort_models(models1) models2 = pw.sort_models(models2) if reverse: models1 = reversed(models1) models2 = reversed(models2) models1 = OrderedDict([(m._meta.name, m) for m in models1]) models2 = OrderedDict([(m._meta.name, m) for m in models2]) changes = [] for name, model1 in models1.items(): if name not in models2: continue changes += diff_one(model1, models2[name], migrator=migrator) # Add models for name in [m for m in models1 if m not in models2]: changes.append(create_model(models1[name], migrator=migrator)) # Remove models for name in [m for m in models2 if m not in models1]: changes.append(remove_model(models2[name])) return changes
def diff_many(models1, models2, migrator=None, reverse=False): """Calculate changes for migrations from models2 to models1.""" models1 = pw.sort_models(models1) models2 = pw.sort_models(models2) if reverse: models1 = reversed(models1) models2 = reversed(models2) models1 = OrderedDict([(m._meta.name, m) for m in models1]) models2 = OrderedDict([(m._meta.name, m) for m in models2]) changes = [] for name, model1 in models1.items(): if name not in models2: continue changes += diff_one(model1, models2[name], migrator=migrator) # Add models for name in [m for m in models1 if m not in models2]: changes.append(create_model(models1[name], migrator=migrator)) # Remove models for name in [m for m in models2 if m not in models1]: changes.append(remove_model(models2[name])) return changes
def test_sort_models(self): class A(Model): pass class B(Model): a = ForeignKeyField(A) class C(Model): b = ForeignKeyField(B) class D(Model): c = ForeignKeyField(C) class E(Model): pass models = [A, B, C, D, E] for list_of_models in permutations(models): sorted_models = sort_models(list_of_models) self.assertEqual(sorted_models, models)
def create(self, modelstr): """ Create a new migration file for an existing model. Model could actually also be a module, in which case all Peewee models are extracted from the model and created. :param modelstr: Python class, module, or string pointing to a class or module. :return: True if migration file was created, otherwise False. :type: bool """ model = modelstr if isinstance(modelstr, str): model = pydoc.locate(modelstr) if not model: LOGGER.info('could not import: {}'.format(modelstr)) return False # If it's a module, we need to loop through all the models in it. if inspect.ismodule(model): model_list = [] for item in model.__dict__.values(): if inspect.isclass(item) and issubclass(item, peewee.Model): # Don't create migration file for imported models. if model.__name__ != item.__module__: continue model_list.append(item) for model in peewee.sort_models(model_list): self.create(model) return True try: name = 'create table {}'.format(model._meta.table_name.lower()) migration = self.next_migration(name) up_ops = build_upgrade_from_model(model) down_ops = build_downgrade_from_model(model) self.write_migration(migration, name=name, upgrade=up_ops, downgrade=down_ops) except Exception as exc: LOGGER.error(exc) return False LOGGER.info('created: {}'.format(migration)) return True
def create(self, modelstr): """ Create a new migration file for an existing model. Model could actually also be a module, in which case all Peewee models are extracted from the model and created. :param modelstr: Python class, module, or string pointing to a class or module. :return: True if migration file was created, otherwise False. :type: bool """ model = modelstr if isinstance(modelstr, str): model = pydoc.locate(modelstr) if not model: LOGGER.info('could not import: {}'.format(modelstr)) return False # If it's a module, we need to loop through all the models in it. if inspect.ismodule(model): model_list = [] for item in model.__dict__.values(): if inspect.isclass(item) and issubclass(item, peewee.Model): # Don't create migration file for imported models. if model.__name__ != item.__module__: continue model_list.append(item) for model in peewee.sort_models(model_list): self.create(model) return True try: name = 'create table {}'.format(model._meta.table_name.lower()) migration = self.next_migration(name) up_ops = build_upgrade_from_model(model) down_ops = build_downgrade_from_model(model) self.write_migration(migration, name=name, upgrade=up_ops, downgrade=down_ops) except Exception as exc: LOGGER.error(exc) return False LOGGER.info('created: {}'.format(migration)) return True
async def drop_tables(self, models, **kwargs): for model in reversed(sort_models(models)): await model.drop_table(**kwargs)
async def create_tables(self, models, **options): for model in sort_models(models): await model.create_table(**options)
async def drop_tables(self, models, **kwargs): for model in reversed(sort_models(models)): await model.drop_table(**kwargs)
async def create_tables(self, models, **options): for model in sort_models(models): await model.create_table(**options)
def clear_tables(create_tables: None): for model in reversed(sort_models(list_models())): db.execute_sql(f'DELETE FROM "{model._meta.table_name}"', )