mirror of
https://github.com/simonw/sqlite-utils.git
synced 2026-07-23 09:24:31 +02:00
--convert function can now modify row in place, closes #371
This commit is contained in:
parent
b8c134059e
commit
22c8d10dd3
5 changed files with 49 additions and 38 deletions
|
|
@ -824,7 +824,7 @@ def insert_upsert_implementation(
|
|||
except TypeError:
|
||||
raise click.ClickException("--convert must return dict or iterator")
|
||||
else:
|
||||
docs = (fn(doc) for doc in docs)
|
||||
docs = (fn(doc) or doc for doc in docs)
|
||||
|
||||
extra_kwargs = {"ignore": ignore, "replace": replace, "truncate": truncate}
|
||||
if not_null:
|
||||
|
|
@ -2225,11 +2225,7 @@ def convert(
|
|||
try:
|
||||
fn = _compile_code(code, imports)
|
||||
except SyntaxError as e:
|
||||
raise click.ClickException(
|
||||
"Syntax error in code:\n\n{}\n\n{}".format(
|
||||
textwrap.indent(e.text.strip(), " "), e.msg
|
||||
)
|
||||
)
|
||||
raise click.ClickException(str(e))
|
||||
if dry_run:
|
||||
# Pull first 20 values for first column and preview them
|
||||
db.conn.create_function("preview_transform", 1, lambda v: fn(v) if v else v)
|
||||
|
|
|
|||
|
|
@ -293,15 +293,25 @@ def _compile_code(code, imports, variable="value"):
|
|||
pass
|
||||
|
||||
# Try compiling their code as a function instead
|
||||
|
||||
# If single line and no 'return', add the return
|
||||
body_variants = [code]
|
||||
# If single line and no 'return', try adding the return
|
||||
if "\n" not in code and not code.strip().startswith("return "):
|
||||
code = "return {}".format(code)
|
||||
body_variants.insert(0, "return {}".format(code))
|
||||
|
||||
new_code = ["def fn({}):".format(variable)]
|
||||
for line in code.split("\n"):
|
||||
new_code.append(" {}".format(line))
|
||||
code_o = compile("\n".join(new_code), "<string>", "exec")
|
||||
code_o = None
|
||||
for variant in body_variants:
|
||||
new_code = ["def fn({}):".format(variable)]
|
||||
for line in variant.split("\n"):
|
||||
new_code.append(" {}".format(line))
|
||||
try:
|
||||
code_o = compile("\n".join(new_code), "<string>", "exec")
|
||||
break
|
||||
except SyntaxError:
|
||||
# Try another variant, e.g. for 'return row["column"] = 1'
|
||||
continue
|
||||
|
||||
if code_o is None:
|
||||
raise SyntaxError("Could not compile code")
|
||||
|
||||
for import_ in imports:
|
||||
globals[import_.split(".")[0]] = __import__(import_)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue