def get_or_create(Model, **kwargs): ''' A get_or_create method exactly like the peewee's one, but compatible with SQLite (does not starts a transaction if SQLite is used because it does not support nested transactions). ''' defaults = kwargs.pop('defaults', {}) query = Model.select() for field, value in kwargs.items(): if '__' in field: query = query.filter(**{field: value}) else: query = query.where(getattr(Model, field) == value) try: return query.get(), False except Model.DoesNotExist: try: params = dict((k, v) for k, v in kwargs.items() if '__' not in k) params.update(defaults) if type(Model._meta.database) == SqliteDatabase: return Model.create(**params), True else: with Model._meta.database.atomic(): return Model.create(**params), True except IntegrityError as exc: try: return query.get(), False except Model.DoesNotExist: raise exc
def _dump_table(table: Model, directory: Path, format_: str): """Dump a single table.""" try: table.select().tuples() table.fields() dataset = tablib.Dataset(*table.select().tuples(), headers=table.fields()) except: print(table._meta.database.get_columns(table.table_name())) if directory is not None: print(f" Dumping {table.table_name()}...") out_file = Path(directory) / f"{table.table_name()}.{format_}" out_file.write_text(dataset.export(format_)) print(" Done.") print("=====================") else: print(dataset.export("csv"))
def get_without_failing(Model, query): results = Model.select().where(query).limit(1) return results[0] if len(results) > 0 else None