upsert_all() throws issue when upserting to empty table
See original GitHub issueIf I try to add a list of dict
s to an empty table using upsert_all
, I get an error:
import sqlite3
from sqlite_utils import Database
import pandas as pd
conx = sqlite3.connect(':memory')
cx = conx.cursor()
cx.executescript('CREATE TABLE "test" ("Col1" TEXT);')
q="SELECT * FROM test;"
pd.read_sql(q, conx) #shows empty table
db = Database(conx)
db['test'].upsert_all([{'Col1':'a'},{'Col1':'b'}])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-74-8c26d93d7587> in <module>
1 db = Database(conx)
----> 2 db['test'].upsert_all([{'Col1':'a'},{'Col1':'b'}])
/usr/local/lib/python3.7/site-packages/sqlite_utils/db.py in upsert_all(self, records, pk, foreign_keys, column_order, not_null, defaults, batch_size, hash_id, alter, extracts)
1157 alter=alter,
1158 extracts=extracts,
-> 1159 upsert=True,
1160 )
1161
/usr/local/lib/python3.7/site-packages/sqlite_utils/db.py in insert_all(self, records, pk, foreign_keys, column_order, not_null, defaults, batch_size, hash_id, alter, ignore, replace, extracts, upsert)
1040 sql = "INSERT OR IGNORE INTO [{table}]({pks}) VALUES({pk_placeholders});".format(
1041 table=self.name,
-> 1042 pks=", ".join(["[{}]".format(p) for p in pks]),
1043 pk_placeholders=", ".join(["?" for p in pks]),
1044 )
TypeError: 'NoneType' object is not iterable
A hacky workaround in use is:
try:
db['test'].upsert_all([{'Col1':'a'},{'Col1':'b'}])
except:
db['test'].insert_all([{'Col1':'a'},{'Col1':'b'}])
Issue Analytics
- State:
- Created 4 years ago
- Comments:6 (3 by maintainers)
Top Results From Across the Web
Delta Upsert performance on empty table
Hello all,. I was just wandering, performance wise how does it compare a plain write operation with a merge operation on an EMPTY...
Read more >UNIQUE constraint exception thrown on empty table INSERT ...
I have found the solution myself: the derived SELECT returns 2 records with 'dummy' due to a duplicate INTO one of table, AttributeType, ......
Read more >[SUPPORT] Small Table Upsert sometimes take a lot of time
Hi Guys, Sometimes my Hudi upserts take so long, this table job used to run in less than 2 minutes and I have...
Read more >How to use `INSERT ON CONFLICT` to upsert data in ... - Prisma
PostgreSQL lets you either add or modify a record within a table depending on whether the record already exists. This is commonly known...
Read more >Bulk insert support in Rails 6 - BigBinary Blog
Rails leverages database-specific features to either skip, or upsert the duplicates, depending on the case. Let's discuss insert_all, insert_all ...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
I think this is because you forgot to include a
pk=
argument. I’ll change the code to throw a more useful error in this case.So the conundrum continues… The simple test case above now runs, but if I upsert a large number of new records (successfully) and then try to upsert a fewer number of new records to a different table, I get the same error.
If I run the same upserts again (which in the first case means there are no new records to add, because they were already added), the second upsert works correctly.
It feels as if the number of items added via an upsert >> the number of items I try to add in an upsert immediately after, I get the error.