Implement nullable in importer
parent
ba72eab938
commit
313449e200
|
@ -18,10 +18,11 @@ models = {
|
|||
@click.option('--lookup', help='On which fields to lookup existing records', multiple=True)
|
||||
@click.option('--columns', help='Override column names in CSV file')
|
||||
@click.option('--map', help='CSV column -> model field mapping (ex. ID:id)', multiple=True)
|
||||
@click.option('--nullable', help='If specified field is empty, assume it is None', multiple=True)
|
||||
@click.option('--delimiter')
|
||||
@click.option('--ignore-header/--no-ignore-header', help='Ignore first line of output if specifying custom fields', default=False)
|
||||
@click.option('--commit-chunk', default=0)
|
||||
def import_file(input_file, model, lookup, columns=None, delimiter=',', ignore_header=False, map=[], commit_chunk=0):
|
||||
def import_file(input_file, model, lookup, columns=None, delimiter=',', ignore_header=False, map=[], commit_chunk=0, nullable=[]):
|
||||
m = models.get(model)
|
||||
|
||||
csv_reader = csv.reader(input_file, delimiter=delimiter)
|
||||
|
@ -34,14 +35,14 @@ def import_file(input_file, model, lookup, columns=None, delimiter=',', ignore_h
|
|||
mapping = dict([m.split(':') for m in map])
|
||||
|
||||
for idx, row in enumerate(csv_reader):
|
||||
row_data = {mapping.get(k, k): v for k, v in zip(columns, row)}
|
||||
row_data = {mapping.get(k, k): (None if v == '' and mapping.get(k,k) in nullable else v) for k, v in zip(columns, row)}
|
||||
lookup_query = {f: row_data[f] for f in lookup}
|
||||
try:
|
||||
obj = m.query.filter_by(**lookup_query).one()
|
||||
print('Updating object', lookup_query)
|
||||
except Exception as exc:
|
||||
obj = m()
|
||||
print('Creating new object', lookup_query)
|
||||
print('Creating new object', lookup_query, exc)
|
||||
|
||||
for k, v in row_data.items():
|
||||
setattr(obj, k, v)
|
||||
|
|
Loading…
Reference in New Issue