question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

sqlite-utils insert errors should show SQL and parameters, if possible

See original GitHub issue

I’ve tried several approaches, but this is the current one:

echo $json-line | sqlite-utils insert json.db jsontable --truncate --alter --detect-types -

In all cases, I get this error:

OverflowError: Python int too large to convert to SQLite INTEGER
Traceback (most recent call last):
  File "/home/sean/.local/bin/sqlite-utils", line 8, in <module>
    sys.exit(cli())
  File "/usr/lib/python3/dist-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3/dist-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3/dist-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3/dist-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/home/sean/.local/lib/python3.8/site-packages/sqlite_utils/cli.py", line 841, in insert
    insert_upsert_implementation(
  File "/home/sean/.local/lib/python3.8/site-packages/sqlite_utils/cli.py", line 780, in insert_upsert_implementation
    db[table].insert_all(
  File "/home/sean/.local/lib/python3.8/site-packages/sqlite_utils/db.py", line 2145, in insert_all
    self.insert_chunk(
  File "/home/sean/.local/lib/python3.8/site-packages/sqlite_utils/db.py", line 1957, in insert_chunk
    result = self.db.execute(query, params)
  File "/home/sean/.local/lib/python3.8/site-packages/sqlite_utils/db.py", line 257, in execute
    return self.conn.execute(sql, parameters)

I googled the error and checked SO answers and advice, all good. I changed my JSON file to not use integers so I no longer get this error. Of course, that makes using the database a bit harder, so I also tried to solve the problem by modifying DB structure (while using integers in JSON).

If change all INTEGER Data Types to something else (STRING, TEXT) and try to import again using --truncate, I still get this error. I suppose I should tell sqlite-utils which columns should use non-INTEGER Data Type rather than rely on it to check my SQL table configuration.

If that is the case, can this error be a bit more specific for easier troubleshooting - maybe tell us which which record caused the problem when that error is thrown?

My table has 60+ columns, many of which use 64-bit integers (not all records are large or known in advance), so while I can modify JSON to use strings instead of integers, it decreases usability and finding out which records have values for which SQLite integers aren’t sufficient requires some work (I’m thinking about parsing all integers with jq and sorting output by length to identify those columns, but I’d prefer if sqlite-utils could tell me that).

My environment:

  • Python 3.8.10
    • sqlite-utils 3.14
    • pandas 1.3.1
    • numpy 1.21.1
    • sqlite-fts4 1.0.1
  • sqlite 3.31.1-4ubuntu0.2

Issue Analytics

  • State:closed
  • Created 2 years ago
  • Comments:6 (6 by maintainers)

github_iconTop GitHub Comments

1reaction
simonwcommented, Aug 9, 2021
OverflowError: Python int too large to convert to SQLite INTEGER
>>> import sys
>>> def find_variables(tb, vars):
        to_find = list(vars)
        found = {}
        for var in to_find:
            if var in tb.tb_frame.f_locals:
                vars.remove(var)
                found[var] = tb.tb_frame.f_locals[var]
        if vars and tb.tb_next:
            found.update(find_variables(tb.tb_next, vars))
        return found
... 
>>> find_variables(sys.last_traceback, ["sql", "params"])
{'params': [34223049823094832094802398430298048240], 'sql': 'INSERT INTO [row] ([v]) VALUES (?);'}
0reactions
simonwcommented, Aug 9, 2021
Read more comments on GitHub >

github_iconTop Results From Across the Web

sqlite_utils Python library - sqlite-utils - Datasette
Upserting allows you to insert records if they do not exist and update them if they DO exist, based on matching against their...
Read more >
sqlite-utils command-line tool
The sqlite-utils memory command works similar to sqlite-utils query , but allows you to execute queries against an in-memory database. You can also...
Read more >
sqlite-utils documentation - Datasette
Python utility functions for manipulating SQLite databases. This library and command-line utility helps create SQLite databases from an ...
Read more >
sqlite-utils documentation - Datasette
Python utility functions for manipulating SQLite databases. This library and command-line utility helps create SQLite databases from an ...
Read more >
sqlite-utils documentation - Datasette
1.2.24 Converting column values using SQL functions . ... If you have data as JSON, you can use sqlite-utils insert tablename to insert...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found