html_url,issue_url,id,node_id,user,user_label,created_at,updated_at,author_association,body,reactions,issue,issue_label,performed_via_github_app https://github.com/simonw/sqlite-utils/issues/66#issuecomment-569844426,https://api.github.com/repos/simonw/sqlite-utils/issues/66,569844426,MDEyOklzc3VlQ29tbWVudDU2OTg0NDQyNg==,9599,simonw,2019-12-31T01:30:20Z,2019-12-31T01:30:20Z,OWNER,"I shipped 2.0 - release notes here: https://sqlite-utils.readthedocs.io/en/stable/changelog.html#v2 I also wrote about it on my blog: https://simonwillison.net/2019/Dec/30/sqlite-utils-2/","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-569588216,https://api.github.com/repos/simonw/sqlite-utils/issues/66,569588216,MDEyOklzc3VlQ29tbWVudDU2OTU4ODIxNg==,9599,simonw,2019-12-30T05:31:45Z,2019-12-30T05:31:45Z,OWNER,Last step: update changelog and ship 2.0. Then I can close this issue.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-569226620,https://api.github.com/repos/simonw/sqlite-utils/issues/66,569226620,MDEyOklzc3VlQ29tbWVudDU2OTIyNjYyMA==,9599,simonw,2019-12-27T09:05:29Z,2019-12-27T09:05:36Z,OWNER,"I'm going to start by ignoring the existing `upsert` entirely and implementing `.insert(..., replace=True)` and `$ sqlite-utils insert --replace`. Including updating the tests. Then I'll figure out how to implement the new `.upsert()` / `$ sqlite-utils upsert`. Then I'll update the documentation, and ship `sqlite-utils` 2.0.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-569131397,https://api.github.com/repos/simonw/sqlite-utils/issues/66,569131397,MDEyOklzc3VlQ29tbWVudDU2OTEzMTM5Nw==,9599,simonw,2019-12-26T20:49:11Z,2019-12-26T20:49:11Z,OWNER,Don't forget to update the documentation. This will be quite an involved task.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-555690319,https://api.github.com/repos/simonw/sqlite-utils/issues/66,555690319,MDEyOklzc3VlQ29tbWVudDU1NTY5MDMxOQ==,9599,simonw,2019-11-19T20:10:17Z,2019-11-19T20:10:17Z,OWNER,"Thinking about this further: I believe every time I've personally used `upsert` in the past (either with the Python library or the CLI tool) I've actually wanted the new behaviour, where ""upsert"" means ""update existing record with these changes, or insert a new record if one does not exist"". So I'm happy with `upsert` doing that, and `insert --replace` being added as an option that does what `upsert` does ta the moment. I'll still ship it as version 2.0 since it's technically a breaking change.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-554565198,https://api.github.com/repos/simonw/sqlite-utils/issues/66,554565198,MDEyOklzc3VlQ29tbWVudDU1NDU2NTE5OA==,9599,simonw,2019-11-15T23:12:28Z,2019-11-15T23:12:28Z,OWNER,"Urgh this is going to be quite a bit of work, especially in the CLI module which shares an implementation for `upsert` and `insert` in a way that looks like it will have to be unwrapped.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-553574011,https://api.github.com/repos/simonw/sqlite-utils/issues/66,553574011,MDEyOklzc3VlQ29tbWVudDU1MzU3NDAxMQ==,9599,simonw,2019-11-13T19:53:45Z,2019-11-13T19:53:45Z,OWNER,"First step: add a `replace=True` argument to `insert()` and `insert_all()` that does the same thing as the current `upsert=True` https://github.com/simonw/sqlite-utils/blob/8dab9fd1ccf571e188eec9ccf606a0c50fccf200/sqlite_utils/db.py#L938-L946","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-553540146,https://api.github.com/repos/simonw/sqlite-utils/issues/66,553540146,MDEyOklzc3VlQ29tbWVudDU1MzU0MDE0Ng==,9599,simonw,2019-11-13T18:33:30Z,2019-11-13T18:33:30Z,OWNER,"Maybe instead of inventing a new term I should tell people to use `.insert(..., replace=True)` directly. That matches `ignore=True`.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-553528850,https://api.github.com/repos/simonw/sqlite-utils/issues/66,553528850,MDEyOklzc3VlQ29tbWVudDU1MzUyODg1MA==,9599,simonw,2019-11-13T18:04:20Z,2019-11-13T18:04:20Z,OWNER,This is going to affect the design of the CLI subcommands as well.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-553528386,https://api.github.com/repos/simonw/sqlite-utils/issues/66,553528386,MDEyOklzc3VlQ29tbWVudDU1MzUyODM4Ng==,9599,simonw,2019-11-13T18:03:10Z,2019-11-13T18:03:54Z,OWNER,"Maybe `inplace()` (combining ""insert"" and ""replace"")? It could be an alias for `.insert(..., replace=True)`","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-553527384,https://api.github.com/repos/simonw/sqlite-utils/issues/66,553527384,MDEyOklzc3VlQ29tbWVudDU1MzUyNzM4NA==,9599,simonw,2019-11-13T18:00:41Z,2019-11-13T18:00:41Z,OWNER,Is `replace()` a good name here? It doesn't really convey the idea that a brand new record will be created if there isn't an existing one to replace.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-553526685,https://api.github.com/repos/simonw/sqlite-utils/issues/66,553526685,MDEyOklzc3VlQ29tbWVudDU1MzUyNjY4NQ==,9599,simonw,2019-11-13T17:58:59Z,2019-11-13T17:58:59Z,OWNER,"This warrants making a backwards compatible change, which means I'll need to bump the major version number and release 2.0. I'm going to rename the existing `upsert()` and `upsert_all()` methods to `replace()` and `replace_all()` - then write new `upsert()` and `upsert_all()` methods that implement the correct behavior.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-553171414,https://api.github.com/repos/simonw/sqlite-utils/issues/66,553171414,MDEyOklzc3VlQ29tbWVudDU1MzE3MTQxNA==,9599,simonw,2019-11-12T23:52:35Z,2019-11-12T23:52:35Z,OWNER,"If I do implement the correct definition of `.upsert()` I think I'll use this pattern, since it works in versions of SQLite prior to 3.24: ```sql INSERT OR IGNORE INTO book(id) VALUES(1001); UPDATE book SET name = 'Programming' WHERE id = 1001; ```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-553171011,https://api.github.com/repos/simonw/sqlite-utils/issues/66,553171011,MDEyOklzc3VlQ29tbWVudDU1MzE3MTAxMQ==,9599,simonw,2019-11-12T23:50:52Z,2019-11-12T23:50:52Z,OWNER,"Fixing this is going to be a real pain. There's lots of code out there that uses `sqlite-utils` with the expectation that `upsert()` behaves as it currently does. Maybe I need to introduce new terms for both of these different patterns and deprecate the existing `.upsert()` and `.upsert_all()` since their behaviour can't be changed? Or maybe I fix this and ship `sqlite-utils 2.0` with a breaking change?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed", https://github.com/simonw/sqlite-utils/issues/66#issuecomment-553170650,https://api.github.com/repos/simonw/sqlite-utils/issues/66,553170650,MDEyOklzc3VlQ29tbWVudDU1MzE3MDY1MA==,9599,simonw,2019-11-12T23:49:29Z,2019-11-12T23:49:29Z,OWNER,This relates to this bug: https://github.com/dogsheep/github-to-sqlite/pull/8#issuecomment-549233778,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521868864,"The "".upsert()"" method is misnamed",