示例#1
0
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
示例#2
0
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"))
示例#3
0
def get_without_failing(Model, query):
    results = Model.select().where(query).limit(1)
    return results[0] if len(results) > 0 else None