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/datasette/pull/631#issuecomment-553233439,https://api.github.com/repos/simonw/datasette/issues/631,553233439,MDEyOklzc3VlQ29tbWVudDU1MzIzMzQzOQ==,9599,simonw,2019-11-13T04:26:40Z,2019-11-13T04:26:40Z,OWNER,"Nice fix, thanks!","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521923131,bugfix issue 572, https://github.com/simonw/datasette/issues/632#issuecomment-553264586,https://api.github.com/repos/simonw/datasette/issues/632,553264586,MDEyOklzc3VlQ29tbWVudDU1MzI2NDU4Ng==,9599,simonw,2019-11-13T06:47:53Z,2019-11-13T06:47:53Z,OWNER,https://github.com/simonw/datasette/blob/973f8f139df6ad425354711052cfc2256de2e522/datasette/publish/heroku.py#L167,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521995039,Upgrade datasette publish Heroku runtime, https://github.com/simonw/datasette/issues/633#issuecomment-553483419,https://api.github.com/repos/simonw/datasette/issues/633,553483419,MDEyOklzc3VlQ29tbWVudDU1MzQ4MzQxOQ==,9599,simonw,2019-11-13T16:35:34Z,2019-11-13T16:35:34Z,OWNER,"The problem is this code in uvicorn: https://github.com/encode/uvicorn/blob/020dd085a0a5b609f14ddd2b36fc0a97ba4df019/uvicorn/main.py#L297-L302 ```python if (config.reload or config.workers > 1) and not isinstance(app, str): logger = logging.getLogger(""uvicorn.error"") logger.warn( ""You must pass the application as an import string to enable 'reload' or 'workers'."" ) sys.exit(1) ``` From this commit 4 days ago: https://github.com/encode/uvicorn/commit/b034f7a136c5e57a33ffd10ce2404cc1faee9033 - see Uvicorn https://github.com/encode/uvicorn/issues/478 and https://github.com/encode/uvicorn/pull/481 This is breaking because `--workers` ""Defaults to the $WEB_CONCURRENCY environment variable if available"" - and it turns out on Heroku WEB_CONCURRENCY is set to 2 by default!","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",522334771,"Publish to Heroku is broken: ""WARNING: You must pass the application as an import string to enable 'reload' or 'workers""", https://github.com/simonw/datasette/issues/633#issuecomment-553483633,https://api.github.com/repos/simonw/datasette/issues/633,553483633,MDEyOklzc3VlQ29tbWVudDU1MzQ4MzYzMw==,9599,simonw,2019-11-13T16:36:02Z,2019-11-13T16:36:35Z,OWNER,Short term fix: set `--workers=1` when publishing with Heroku. Or even easier - set WEB_CONCURRENCY to 1.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",522334771,"Publish to Heroku is broken: ""WARNING: You must pass the application as an import string to enable 'reload' or 'workers""", https://github.com/simonw/datasette/issues/632#issuecomment-553487179,https://api.github.com/repos/simonw/datasette/issues/632,553487179,MDEyOklzc3VlQ29tbWVudDU1MzQ4NzE3OQ==,9599,simonw,2019-11-13T16:44:07Z,2019-11-13T16:44:07Z,OWNER,Here's an instance deployed using the new code which shows Python 3.8.0: https://datasette-fixtures.herokuapp.com/-/versions,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",521995039,Upgrade datasette publish Heroku runtime, 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-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-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-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-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/datasette/pull/578#issuecomment-553555517,https://api.github.com/repos/simonw/datasette/issues/578,553555517,MDEyOklzc3VlQ29tbWVudDU1MzU1NTUxNw==,9599,simonw,2019-11-13T19:13:15Z,2019-11-13T19:13:15Z,OWNER,Yes I'm going to hold of on this until the Docker feature is less experimental.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",499954048,Added support for multi arch builds, https://github.com/simonw/datasette/pull/389#issuecomment-553555669,https://api.github.com/repos/simonw/datasette/issues/389,553555669,MDEyOklzc3VlQ29tbWVudDU1MzU1NTY2OQ==,9599,simonw,2019-11-13T19:13:41Z,2019-11-13T19:13:41Z,OWNER,This is very obsolete now.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",382471625,Bump dependency versions, 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",