issue_comments
7,931 rows where author_association = "OWNER" sorted by body
This data as json, CSV (advanced)
id | html_url | issue_url | node_id | user | created_at | updated_at | author_association | body ▼ | reactions | issue | performed_via_github_app |
---|---|---|---|---|---|---|---|---|---|---|---|
590399600 | https://github.com/simonw/datasette/issues/682#issuecomment-590399600 | https://api.github.com/repos/simonw/datasette/issues/682 | MDEyOklzc3VlQ29tbWVudDU5MDM5OTYwMA== | simonw 9599 | 2020-02-24T15:56:10Z | 2020-02-24T15:56:23Z | OWNER | ## Implementation plan Method on Database class called `execute_write(sql)` Which calls `.execute_write_fn(fn)` - so you can instead create a function that applies a whole batch of writes and pass that instead if you need to Throws an error of database isn't mutable. Add `._writer_thread` thread property to Database - we start that thread the first time we need it. It blocks on `._writer_queue.get()` We write to that queue with `WriteTask(fn, uuid, reply_queue)` namedtuples - then time-out block awaiting reply for 0.5s Have a `.write_status(uuid)` method that checks if `uuid` has completed This should be enough to get it all working. MVP can skip the .5s timeout entirely But... what about that progress bar supporting stretch goal? For that let's have each write operation that's currently in progress have total and done integer properties. So I guess we can add those to the `WriteTask`. Should we have the ability to see what the currently executing write is? Seems useful. Hopefully I can integrate https://github.com/tqdm/tqdm such that it calculates ETAs without actually trying to print to the console. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Mechanism for writing to database via a queue 569613563 | |
1095687566 | https://github.com/simonw/datasette/issues/1708#issuecomment-1095687566 | https://api.github.com/repos/simonw/datasette/issues/1708 | IC_kwDOBm6k_c5BTt2O | simonw 9599 | 2022-04-11T23:24:30Z | 2022-04-11T23:24:30Z | OWNER | ## Redesigned template context **Warning:** if you use any custom templates with your Datasette instance they are likely to break when you upgrade to 1.0. The template context has been redesigned to be based on the documented JSON API. This means that the template context can be considered stable going forward, so any custom templates you implement should continue to work when you upgrade Datasette in the future. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Datasette 1.0 alpha upcoming release notes 1200649124 | |
752257666 | https://github.com/simonw/datasette/issues/1160#issuecomment-752257666 | https://api.github.com/repos/simonw/datasette/issues/1160 | MDEyOklzc3VlQ29tbWVudDc1MjI1NzY2Ng== | simonw 9599 | 2020-12-29T22:09:18Z | 2020-12-29T22:09:18Z | OWNER | ### Figuring out the API design I want to be able to support different formats, and be able to parse them into tables either streaming or in one go depending on if the format supports that. Ideally I want to be able to pull the first 1,024 bytes for the purpose of detecting the format, then replay those bytes again later. I'm considering this a stretch goal though. CSV is easy to parse as a stream - here’s [how sqlite-utils does it](https://github.com/simonw/sqlite-utils/blob/f1277f638f3a54a821db6e03cb980adad2f2fa35/sqlite_utils/cli.py#L630): dialect = "excel-tab" if tsv else "excel" with file_progress(json_file, silent=silent) as json_file: reader = csv_std.reader(json_file, dialect=dialect) headers = next(reader) docs = (dict(zip(headers, row)) for row in reader) Problem: using `db.insert_all()` could block for a long time on a big set of rows. Probably easiest to batch the records before calling `insert_all()` and then run a batch at a time using a `db.execute_write_fn()` call. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | "datasette insert" command and plugin hook 775666296 | |
719959754 | https://github.com/simonw/datasette/issues/1026#issuecomment-719959754 | https://api.github.com/repos/simonw/datasette/issues/1026 | MDEyOklzc3VlQ29tbWVudDcxOTk1OTc1NA== | simonw 9599 | 2020-10-31T16:56:35Z | 2020-10-31T16:56:35Z | OWNER | #1041 can also benefit from the string subclass that shows that `base_url` has been added. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | How should datasette.client interact with base_url 722738988 | |
749750995 | https://github.com/simonw/datasette/issues/1152#issuecomment-749750995 | https://api.github.com/repos/simonw/datasette/issues/1152 | MDEyOklzc3VlQ29tbWVudDc0OTc1MDk5NQ== | simonw 9599 | 2020-12-22T20:05:30Z | 2020-12-22T20:05:30Z | OWNER | #1150 is landed now, which means there's a new, hidden `_internal` SQLite in-memory database containing all of the tables and databases. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Efficiently calculate list of databases/tables a user can view 770598024 | |
804261610 | https://github.com/simonw/datasette/issues/1269#issuecomment-804261610 | https://api.github.com/repos/simonw/datasette/issues/1269 | MDEyOklzc3VlQ29tbWVudDgwNDI2MTYxMA== | simonw 9599 | 2021-03-22T17:40:41Z | 2021-03-22T17:40:41Z | OWNER | #1270 looks promising, and I don't want to leave open a security hole where someone could potentially hang Datasette with a nasty `count(*)` query. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Don't attempt to run count(*) against virtual tables 837348479 | |
504852873 | https://github.com/simonw/datasette/issues/520#issuecomment-504852873 | https://api.github.com/repos/simonw/datasette/issues/520 | MDEyOklzc3VlQ29tbWVudDUwNDg1Mjg3Mw== | simonw 9599 | 2019-06-24T04:28:22Z | 2019-06-24T04:28:22Z | OWNER | #272 is closed now! This hook is next on the priority list. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | asgi_wrapper plugin hook 459598080 | |
720700065 | https://github.com/simonw/datasette/issues/830#issuecomment-720700065 | https://api.github.com/repos/simonw/datasette/issues/830 | MDEyOklzc3VlQ29tbWVudDcyMDcwMDA2NQ== | simonw 9599 | 2020-11-02T20:15:36Z | 2020-11-02T20:15:36Z | OWNER | #427 had a bunch of ambitious plans for faceting that I haven't realized yet: > Think of all of the potential kinds of facets: > > * `?_facet_array=tags` where tags is a JSON array of values > * `_facet_date=datetimecol` - faceted by date part of a datetime > * `_facet_bins=numeric_column` - can I do some kind of fancy binning here? Might need to take an argument > * `?_facet_bins=numeric_column:5` - could be a way to take an argument. We’ll ignore columns with a : in their name. > * `?_facet_json=jsoncol:jsonpath` - could use a JSON path to extract out something to facet on? > * `?_facet_percentile=numericcolumn` - could this work? > * `?_facet_function=column:sqlfunctionname` - maybe this could be interesting? Would allow for e.g. facet by soundex > * `?_facet_prefix=column:prefix` - facet by terms but only if they start with a specific prefix > * `?_facet_substring=column:3,6` - facet by a substr(column, 3, 6) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Redesign register_facet_classes plugin hook 636511683 | |
552276237 | https://github.com/simonw/datasette/pull/595#issuecomment-552276237 | https://api.github.com/repos/simonw/datasette/issues/595 | MDEyOklzc3VlQ29tbWVudDU1MjI3NjIzNw== | simonw 9599 | 2019-11-11T03:12:56Z | 2019-11-11T03:12:56Z | OWNER | #622 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | bump uvicorn to 0.9.0 to be Python-3.8 friendly 506300941 | |
552276247 | https://github.com/simonw/datasette/issues/594#issuecomment-552276247 | https://api.github.com/repos/simonw/datasette/issues/594 | MDEyOklzc3VlQ29tbWVudDU1MjI3NjI0Nw== | simonw 9599 | 2019-11-11T03:13:00Z | 2019-11-11T03:13:00Z | OWNER | #622 | {"total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 1, "rocket": 0, "eyes": 0} | upgrade to uvicorn-0.9 to be Python-3.8 friendly 506297048 | |
552276277 | https://github.com/simonw/datasette/pull/404#issuecomment-552276277 | https://api.github.com/repos/simonw/datasette/issues/404 | MDEyOklzc3VlQ29tbWVudDU1MjI3NjI3Nw== | simonw 9599 | 2019-11-11T03:13:09Z | 2019-11-11T03:13:09Z | OWNER | #622 will drop 3.5 support. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Experiment: run Jinja in async mode 403499298 | |
981172801 | https://github.com/simonw/datasette/issues/1518#issuecomment-981172801 | https://api.github.com/repos/simonw/datasette/issues/1518 | IC_kwDOBm6k_c46e4JB | simonw 9599 | 2021-11-28T23:23:51Z | 2021-11-28T23:23:51Z | OWNER | (I could experiment with merging the two tables by adding a temporary undocumented `?_sql=` parameter to the in-progress table view that sets an alternative query instead of `select cols from table` - added bonus, this will force me to use introspection against the returned columns rather than mixing in the known columns for the specified table) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Complete refactor of TableView and table.html template 1058072543 | |
1214414320 | https://github.com/simonw/datasette/issues/1779#issuecomment-1214414320 | https://api.github.com/repos/simonw/datasette/issues/1779 | IC_kwDOBm6k_c5IYn3w | simonw 9599 | 2022-08-14T16:54:32Z | 2022-08-14T16:54:32Z | OWNER | (I deleted my `issue-1779` project using the UI at https://console.cloud.google.com/run?project=datasette-222320) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | google cloudrun updated their limits on maxscale based on memory and cpu count 1334628400 | |
987349633 | https://github.com/simonw/sqlite-utils/issues/349#issuecomment-987349633 | https://api.github.com/repos/simonw/sqlite-utils/issues/349 | IC_kwDOCGYnMM462cKB | simonw 9599 | 2021-12-06T23:19:28Z | 2021-12-06T23:19:28Z | OWNER | (I ended up not needing this here since `.lookup()` already creates a unique index on `_item_id` for you. Still could be a useful feature though.) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | A way of creating indexes on newly created tables 1071531082 | |
1112717745 | https://github.com/simonw/datasette/issues/1729#issuecomment-1112717745 | https://api.github.com/repos/simonw/datasette/issues/1729 | IC_kwDOBm6k_c5CUrmx | simonw 9599 | 2022-04-28T22:38:39Z | 2022-04-28T22:39:05Z | OWNER | (I remain keen on the idea of shipping a plugin that restores the old default API shape to people who have written pre-Datasette-1.0 code against it, but I'll tackle that much later. I really like how jQuery has a culture of doing this.) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Implement ?_extra and new API design for TableView 1219385669 | |
782747164 | https://github.com/simonw/datasette/issues/782#issuecomment-782747164 | https://api.github.com/repos/simonw/datasette/issues/782 | MDEyOklzc3VlQ29tbWVudDc4Mjc0NzE2NA== | simonw 9599 | 2021-02-20T20:47:16Z | 2021-02-20T20:47:16Z | OWNER | (I started a thread on Twitter about this: https://twitter.com/simonw/status/1363220355318358016) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Redesign default .json format 627794879 | |
691526489 | https://github.com/simonw/datasette/issues/782#issuecomment-691526489 | https://api.github.com/repos/simonw/datasette/issues/782 | MDEyOklzc3VlQ29tbWVudDY5MTUyNjQ4OQ== | simonw 9599 | 2020-09-12T18:17:16Z | 2020-09-12T18:17:16Z | OWNER | (I think I may have been over-thinking the details of this is for a couple of years now.) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Redesign default .json format 627794879 | |
634946319 | https://github.com/simonw/datasette/issues/581#issuecomment-634946319 | https://api.github.com/repos/simonw/datasette/issues/581 | MDEyOklzc3VlQ29tbWVudDYzNDk0NjMxOQ== | simonw 9599 | 2020-05-27T21:18:50Z | 2020-05-27T21:18:50Z | OWNER | (I used GitHub code search to find code using this plugin hook: https://github.com/search?q=register_output_renderer&type=Code ) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Redesign register_output_renderer callback 502993509 | |
634964457 | https://github.com/simonw/datasette/issues/581#issuecomment-634964457 | https://api.github.com/repos/simonw/datasette/issues/581 | MDEyOklzc3VlQ29tbWVudDYzNDk2NDQ1Nw== | simonw 9599 | 2020-05-27T21:57:35Z | 2020-05-27T21:57:35Z | OWNER | (I wonder if this would be enough to allow really smart plugins to implement ETag/conditional get) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Redesign register_output_renderer callback 502993509 | |
1045027067 | https://github.com/simonw/datasette/issues/1439#issuecomment-1045027067 | https://api.github.com/repos/simonw/datasette/issues/1439 | IC_kwDOBm6k_c4-Sdj7 | simonw 9599 | 2022-02-18T19:03:26Z | 2022-02-18T19:03:26Z | OWNER | (If I make this change it may break some existing Datasette installations when they upgrade - I could try and build a plugin for them which triggers on 404s and checks to see if the old format would return a 200 response, then returns that.) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Rethink how .ext formats (v.s. ?_format=) works before 1.0 973139047 | |
869075395 | https://github.com/simonw/datasette/issues/1384#issuecomment-869075395 | https://api.github.com/repos/simonw/datasette/issues/1384 | MDEyOklzc3VlQ29tbWVudDg2OTA3NTM5NQ== | simonw 9599 | 2021-06-26T23:54:21Z | 2021-06-26T23:59:21Z | OWNER | (It may well be that implementing #1168 involves a switch to async metadata) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Plugin hook for dynamic metadata 930807135 | |
970770304 | https://github.com/simonw/datasette/issues/1513#issuecomment-970770304 | https://api.github.com/repos/simonw/datasette/issues/1513 | IC_kwDOBm6k_c453MeA | simonw 9599 | 2021-11-16T22:55:19Z | 2021-11-16T22:55:19Z | OWNER | (One thing I really like about this pattern is that it should work exactly the same when used to facet the results of arbitrary SQL queries as it does when faceting results from the table page.) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Research: CTEs and union all to calculate facets AND query at the same time 1055469073 | |
849788412 | https://github.com/simonw/datasette/issues/1344#issuecomment-849788412 | https://api.github.com/repos/simonw/datasette/issues/1344 | MDEyOklzc3VlQ29tbWVudDg0OTc4ODQxMg== | simonw 9599 | 2021-05-27T16:53:28Z | 2021-05-27T16:53:28Z | OWNER | (Should also update https://docs.datasette.io/en/stable/contributing.html#release-process with notes on how this works) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Test Datasette Docker images built for different architectures 903986178 | |
1008151884 | https://github.com/simonw/sqlite-utils/issues/364#issuecomment-1008151884 | https://api.github.com/repos/simonw/sqlite-utils/issues/364 | IC_kwDOCGYnMM48Fy1M | simonw 9599 | 2022-01-08T20:59:21Z | 2022-01-08T20:59:21Z | OWNER | (That Heroku example doesn't record the timestamp, which limits its usefulness) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | `--batch-size 1` doesn't seem to commit for every item 1095570074 | |
997508728 | https://github.com/simonw/sqlite-utils/issues/356#issuecomment-997508728 | https://api.github.com/repos/simonw/sqlite-utils/issues/356 | IC_kwDOCGYnMM47dMZ4 | simonw 9599 | 2021-12-20T01:14:43Z | 2021-12-20T01:14:43Z | OWNER | (This makes me want `--extract` from #352 even more.) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | `sqlite-utils insert --convert` option 1077431957 | |
347735724 | https://github.com/simonw/datasette/issues/153#issuecomment-347735724 | https://api.github.com/repos/simonw/datasette/issues/153 | MDEyOklzc3VlQ29tbWVudDM0NzczNTcyNA== | simonw 9599 | 2017-11-29T02:47:14Z | 2017-11-29T02:47:14Z | OWNER | (This only addresses point 2 in your issue description - points 1 and point 3 are still to come) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Ability to customize presentation of specific columns in HTML view 276842536 | |
804406675 | https://github.com/simonw/datasette/issues/1249#issuecomment-804406675 | https://api.github.com/repos/simonw/datasette/issues/1249 | MDEyOklzc3VlQ29tbWVudDgwNDQwNjY3NQ== | simonw 9599 | 2021-03-22T21:26:27Z | 2021-03-22T21:26:27Z | OWNER | (Without the `apt-get update ...` SpatiaLite line it's 125MB) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Updated Dockerfile with SpatiaLite version 5.0 824064069 | |
407269243 | https://github.com/simonw/datasette/issues/320#issuecomment-407269243 | https://api.github.com/repos/simonw/datasette/issues/320 | MDEyOklzc3VlQ29tbWVudDQwNzI2OTI0Mw== | simonw 9599 | 2018-07-24T03:30:32Z | 2018-07-24T03:30:32Z | OWNER | * No primary key => no "object" option: https://latest.datasette.io/fixtures-dcc1dbf/no_primary_key * Has a primary key => show "object" option: https://latest.datasette.io/fixtures-dcc1dbf/complex_foreign_keys * Has a next page => has "stream all rows" option: https://latest.datasette.io/fixtures-dcc1dbf/no_primary_key * Has foreign key references = show default-checked "expand labels" option: https://latest.datasette.io/fixtures-dcc1dbf/complex_foreign_keys * Does not have a next page => do not show "stream all rows" option: https://latest.datasette.io/fixtures-dcc1dbf/complex_foreign_keys | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Need unit tests covering the different states for the advanced export box 334169932 | |
504782618 | https://github.com/simonw/datasette/pull/518#issuecomment-504782618 | https://api.github.com/repos/simonw/datasette/issues/518 | MDEyOklzc3VlQ29tbWVudDUwNDc4MjYxOA== | simonw 9599 | 2019-06-23T20:05:44Z | 2019-06-23T20:05:59Z | OWNER | **Replacement for @app.listener("before_server_start")** - this is what the [ASGI lifespan protocol](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) is for. I know Uvicorn supports this because it keeps saying `ASGI 'lifespan' protocol appears unsupported` on the console. I think the solution here will be to introduce another ASGI wrapper class similar to `AsgiTracer`. I'll model this on the example in the ASGI lifespan spec. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Port Datasette from Sanic to ASGI + Uvicorn 459587155 | |
636332183 | https://github.com/simonw/datasette/issues/576#issuecomment-636332183 | https://api.github.com/repos/simonw/datasette/issues/576 | MDEyOklzc3VlQ29tbWVudDYzNjMzMjE4Mw== | simonw 9599 | 2020-05-30T13:37:51Z | 2020-05-30T13:38:35Z | OWNER | **\_\_init\_\_**(self, files, immutables=None, cache_headers=True, cors=False, inspect_data=None, metadata=None, sqlite_extensions=None, template_dir=None, plugins_dir=None, static_mounts=None, memory=False, config=None, version_note=None, config_dir=None) `Initialize self. See help(type(self)) for accurate signature.` **absolute_url**(self, request, path) **add_database**(self, name, db) **app**(self) `Returns an ASGI app function that serves the whole of [Datasette](http://localhost:8066/datasette.app.html#Datasette)` **app_css_hash**(self) **config**(self, key) **config_dict**(self) **connected_databases**(self) **execute**(self, db_name, sql, params=None, truncate=False, custom_time_limit=None, page_size=None, log_sql_errors=True) **expand_foreign_keys**(self, database, table, column, values) `Returns dict mapping (column, value) -> label` **get_canned_queries**(self, database_name) **get_canned_query**(self, database_name, query_name) **metadata**(self, key=None, database=None, table=None, fallback=True) `Looks up metadata, cascading backwards from specified level.\ Returns None if metadata value is not found.` **plugin_config**(self, plugin_name, database=None, table=None, fallback=True) `Return config for plugin, falling back from specified database/table` **plugins**(self, show_all=False) **prepare_connection**(self, conn, database) **register_custom_units**(self) `Register any custom units defined in the metadata.json with Pint` **register_renderers**(self) `Register output renderers which output data in custom formats.` **remove_database**(self, name) **render_template**(self, templates, context=None, request=None, view_name=None) **table_metadata**(self, database, table) `Fetch table-specific metadata.` **threads**(self) **update_with_inherited_metadata**(self, metadata) **versions**(self) | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Documented internals API for use in plugins 497170355 | |
683528149 | https://github.com/simonw/sqlite-utils/issues/147#issuecomment-683528149 | https://api.github.com/repos/simonw/sqlite-utils/issues/147 | MDEyOklzc3VlQ29tbWVudDY4MzUyODE0OQ== | simonw 9599 | 2020-08-31T03:17:26Z | 2020-08-31T03:17:26Z | OWNER | +1 to making this something that users can customize. An optional argument to the `Database` constructor would be a neat way to do this. I think there's a terrifying way that we could find this value... we could perform a binary search for it! Open up a memory connection and try running different bulk inserts against it and catch the exceptions - then adjust and try again. My hunch is that we could perform just 2 or 3 probes (maybe against carefully selected values) to find the highest value that works. If this process took less than a few ms to run I'd be happy to do it automatically when the class is instantiated (and let users disable that automatic proving by setting a value using the constructor argument). | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | SQLITE_MAX_VARS maybe hard-coded too low 688670158 | |
1095672127 | https://github.com/simonw/datasette/issues/1711#issuecomment-1095672127 | https://api.github.com/repos/simonw/datasette/issues/1711 | IC_kwDOBm6k_c5BTqE_ | simonw 9599 | 2022-04-11T23:00:58Z | 2022-04-11T23:00:58Z | OWNER | - #1510 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Template context powered entirely by the JSON API format 1200650491 | |
1095671940 | https://github.com/simonw/datasette/issues/1709#issuecomment-1095671940 | https://api.github.com/repos/simonw/datasette/issues/1709 | IC_kwDOBm6k_c5BTqCE | simonw 9599 | 2022-04-11T23:00:39Z | 2022-04-11T23:01:41Z | OWNER | - #262 - #782 - #1509 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Redesigned JSON API with ?_extra= parameters 1200649502 | |
1229320114 | https://github.com/simonw/sqlite-utils/issues/476#issuecomment-1229320114 | https://api.github.com/repos/simonw/sqlite-utils/issues/476 | IC_kwDOCGYnMM5JRe-y | simonw 9599 | 2022-08-27T23:26:48Z | 2022-08-27T23:26:48Z | OWNER | - #458 - the `register_function(name=...)` argument - New tutorial: [Cleaning data with sqlite-utils and Datasette](https://datasette.io/tutorials/clean-data) provides a tutorial introduction (and accompanying ten minute video) about using this tool. - New Discord community, https://discord.gg/Ass7bCAMDw - #469 `sqlite-utils rows --order` option - #471 `sqlite-utils query --functions` option - #472 Improved code compilation pattern - #473 Support entrypoints for `--load-extension` - #455 - #475 `table.default_values` property - #467 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Release notes for 3.29 1353196970 | |
1291203911 | https://github.com/simonw/sqlite-utils/issues/505#issuecomment-1291203911 | https://api.github.com/repos/simonw/sqlite-utils/issues/505 | IC_kwDOCGYnMM5M9jVH | simonw 9599 | 2022-10-25T22:21:02Z | 2022-10-25T22:21:02Z | OWNER | - Now tested against Python 3.11. ([#502](https://github.com/simonw/sqlite-utils/issues/502)) - New `table.search_sql(include_rank=True)` option, which adds a `rank` column to the generated SQL. Thanks, Jacob Chapman. ([#480](https://github.com/simonw/sqlite-utils/pull/480)) - Progress bars now display for newline-delimited JSON files using the `--nl` option. Thanks, Mischa Untaga. ([#485](https://github.com/simonw/sqlite-utils/issues/485)) - New `db.close()` method. ([#504](https://github.com/simonw/sqlite-utils/issues/504)) - Conversion functions passed to [table.convert(...)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-convert) can now return lists or dictionaries, which will be inserted into the database as JSON strings. ([#495](https://github.com/simonw/sqlite-utils/issues/495)) - `sqlite-utils install` and `sqlite-utils uninstall` commands for installing packages into the same virtual environment as `sqlite-utils`, [described here](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-install). ([#483](https://github.com/simonw/sqlite-utils/issues/483)) - New [sqlite_utils.utils.flatten()](https://sqlite-utils.datasette.io/en/stable/reference.html#reference-utils-flatten) utility function. ([#500](https://github.com/simonw/sqlite-utils/issues/500)) - Documentation on [using Just](https://sqlite-utils.datasette.io/en/stable/contributing.html#contributing-just) to run tests, linters and build documentation. - Documentation now covers the [Release process](https://sqlite-utils.datasette.io/en/stable/contributing.html#release-process) for this package. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Release sqlite-utils 3.30 1423182778 | |
1012664607 | https://github.com/simonw/datasette/issues/1595#issuecomment-1012664607 | https://api.github.com/repos/simonw/datasette/issues/1595 | IC_kwDOBm6k_c48XAkf | simonw 9599 | 2022-01-14T01:22:58Z | 2022-01-14T01:22:58Z | OWNER | - Upgraded Pluggy dependency to 1.0. #1575 - Now using [Plausible](https://plausible.io/) analytics for the Datasette documentation. - The `db.execute_write()` internals method now defaults to blocking until the write operation has completed. Previously it defaulted to queuing the write and then continuing to run code while the write was in the queue. #1579 - `explain query plan` is now allowed with varying amounts of white space in the query. #1588 - New CLI reference page showing the output of `--help` for each of the `datasette` sub-commands. This lead to several small improvements to the help copy. #1594 - Fixed bug where columns with a underscore prefix could result in unnecessary hidden form fields. #1527 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Release notes for 0.60 1102484126 | |
343781030 | https://github.com/simonw/datasette/issues/71#issuecomment-343781030 | https://api.github.com/repos/simonw/datasette/issues/71 | MDEyOklzc3VlQ29tbWVudDM0Mzc4MTAzMA== | simonw 9599 | 2017-11-13T00:21:05Z | 2017-11-13T02:09:32Z | OWNER | - [x] Have `now domain add -e datasettes.com` run without errors (hopefully just a matter of waiting for the DNS to update) - [x] Alias an example dataset hosted on Now on a datasettes.com subdomain - [x] Confirm that HTTP caching and HTTP/2 redirect pushing works as expected - this may require another page rule | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Set up some example datasets on a Cloudflare-backed domain 273278840 | |
1347768549 | https://github.com/simonw/datasette/issues/1947#issuecomment-1347768549 | https://api.github.com/repos/simonw/datasette/issues/1947 | IC_kwDOBm6k_c5QVVDl | simonw 9599 | 2022-12-13T05:25:56Z | 2022-12-13T22:29:12Z | OWNER | - [x] I should add a `--database` example to that help text. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | UI to create reduced scope tokens from the `/-/create-token` page 1493390939 | |
343780671 | https://github.com/simonw/datasette/issues/71#issuecomment-343780671 | https://api.github.com/repos/simonw/datasette/issues/71 | MDEyOklzc3VlQ29tbWVudDM0Mzc4MDY3MQ== | simonw 9599 | 2017-11-13T00:15:21Z | 2017-11-13T00:17:37Z | OWNER | - [x] Redirect https://datasettes.com/ and https://www.datasettes.com/ to https://github.com/simonw/datasette | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Set up some example datasets on a Cloudflare-backed domain 273278840 | |
894864616 | https://github.com/simonw/datasette/issues/1424#issuecomment-894864616 | https://api.github.com/repos/simonw/datasette/issues/1424 | IC_kwDOBm6k_c41Vozo | simonw 9599 | 2021-08-08T22:26:08Z | 2021-08-08T22:26:08Z | OWNER | - `datasette.database.QueryInterrupted` for queries that were interrupted - `sqlite3.OperationalError` - `sqlite3.DatabaseError` and more | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Document exceptions that can be raised by db.execute() and friends 963527045 | |
993794247 | https://github.com/simonw/datasette/issues/1518#issuecomment-993794247 | https://api.github.com/repos/simonw/datasette/issues/1518 | IC_kwDOBm6k_c47PBjH | simonw 9599 | 2021-12-14T17:09:40Z | 2021-12-14T17:09:40Z | OWNER | - `table_actions` should be an extra. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Complete refactor of TableView and table.html template 1058072543 | |
1045086033 | https://github.com/simonw/datasette/issues/1439#issuecomment-1045086033 | https://api.github.com/repos/simonw/datasette/issues/1439 | IC_kwDOBm6k_c4-Sr9R | simonw 9599 | 2022-02-18T19:47:43Z | 2022-02-18T19:51:11Z | OWNER | - https://datasette.io/-/asgi-scope/db/./db./table-..csv..csv - https://til.simonwillison.net/-/asgi-scope/db/./db./table-..csv..csv Do both of those survive the round-trip to populate `raw_path` correctly? No! In both cases the `/./` bit goes missing. It looks like this might even be a client issue - `curl` shows me this: ``` ~ % curl -vv -i 'https://datasette.io/-/asgi-scope/db/./db./table-..csv..csv' * Trying 216.239.32.21:443... * Connected to datasette.io (216.239.32.21) port 443 (#0) * ALPN, offering http/1.1 * TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * Server certificate: datasette.io * Server certificate: R3 * Server certificate: ISRG Root X1 > GET /-/asgi-scope/db/db./table-..csv..csv HTTP/1.1 ``` So `curl` decided to turn `/-/asgi-scope/db/./db./table` into `/-/asgi-scope/db/db./table` before even sending the request. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Rethink how .ext formats (v.s. ?_format=) works before 1.0 973139047 | |
1258692555 | https://github.com/simonw/datasette/issues/1821#issuecomment-1258692555 | https://api.github.com/repos/simonw/datasette/issues/1821 | IC_kwDOBm6k_c5LBh_L | simonw 9599 | 2022-09-26T22:06:39Z | 2022-09-26T22:06:39Z | OWNER | - https://github.com/simonw/datasette/actions/runs/3131344150 - https://github.com/simonw/datasette/releases/tag/0.63a0 - https://pypi.org/project/datasette/0.63a0/ | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Release Datasette 0.63a0 1386734383 | |
672287754 | https://github.com/simonw/datasette/issues/923#issuecomment-672287754 | https://api.github.com/repos/simonw/datasette/issues/923 | MDEyOklzc3VlQ29tbWVudDY3MjI4Nzc1NA== | simonw 9599 | 2020-08-11T21:25:33Z | 2020-08-11T21:25:33Z | OWNER | .. and confirm if `brew tap ...` is even needed if you run `brew install simonw/datasette/datasette` | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Add homebrew installation to documentation 677037043 | |
342030075 | https://github.com/simonw/datasette/issues/40#issuecomment-342030075 | https://api.github.com/repos/simonw/datasette/issues/40 | MDEyOklzc3VlQ29tbWVudDM0MjAzMDA3NQ== | simonw 9599 | 2017-11-06T02:25:48Z | 2017-11-06T02:25:48Z | OWNER | ... I tried that, I don't like it. I'm going to bring back "directory serving" by allowing you to pass a directory as an argument to `datasite` (including `datasite .`). I may even make `.` the default if you don't provide anything at all. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Implement command-line tool interface 268470572 | |
805042880 | https://github.com/simonw/datasette/issues/1153#issuecomment-805042880 | https://api.github.com/repos/simonw/datasette/issues/1153 | MDEyOklzc3VlQ29tbWVudDgwNTA0Mjg4MA== | simonw 9599 | 2021-03-23T16:24:32Z | 2021-03-23T16:24:32Z | OWNER | ... actually I think I would do that conversion in Python. The client-side YAML parsers all look a little bit heavy to me in terms of additional page weight. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Use YAML examples in documentation by default, not JSON 771202454 | |
636538298 | https://github.com/simonw/datasette/issues/785#issuecomment-636538298 | https://api.github.com/repos/simonw/datasette/issues/785 | MDEyOklzc3VlQ29tbWVudDYzNjUzODI5OA== | simonw 9599 | 2020-05-31T22:14:43Z | 2020-05-31T22:15:01Z | OWNER | ... actually no I'll do it using a CLI option that can also be in an environment variable: https://click.palletsprojects.com/en/7.x/options/#values-from-environment-variables ```python @click.command() @click.option('--secret', envvar='DATASETTE_SECRET') def greet(secret): ... ``` | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Datasette secret mechanism - initially for signed cookies 628025100 | |
996077053 | https://github.com/simonw/datasette/issues/1552#issuecomment-996077053 | https://api.github.com/repos/simonw/datasette/issues/1552 | IC_kwDOBm6k_c47Xu39 | simonw 9599 | 2021-12-16T18:36:41Z | 2021-12-16T18:36:41Z | OWNER | ... actually no, I WILL document this, because not documenting this is what got us to this point in the first place! | {"total_count": 1, "+1": 0, "-1": 0, "laugh": 1, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Allow to set `facets_array` in metadata (like current `facets`) 1078702875 | |
766536076 | https://github.com/simonw/datasette/issues/983#issuecomment-766536076 | https://api.github.com/repos/simonw/datasette/issues/983 | MDEyOklzc3VlQ29tbWVudDc2NjUzNjA3Ng== | simonw 9599 | 2021-01-25T04:43:53Z | 2021-01-25T04:43:53Z | OWNER | ... actually not going to include this in 0.54, I need to write a couple of plugins myself using it before I even make it available in preview. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | JavaScript plugin hooks mechanism similar to pluggy 712260429 | |
586623462 | https://github.com/simonw/datasette/issues/674#issuecomment-586623462 | https://api.github.com/repos/simonw/datasette/issues/674 | MDEyOklzc3VlQ29tbWVudDU4NjYyMzQ2Mg== | simonw 9599 | 2020-02-15T17:36:53Z | 2020-03-26T17:19:23Z | OWNER | ... actually we don't need to do that, we have a mechanism for that already: https://github.com/simonw/datasette/blob/f1442a8151f66ceef6517b6d3d045e2ec1d0f0ec/tests/build_small_spatialite_db.py | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Rethink how sanity checks work 565552217 | |
1289774183 | https://github.com/simonw/datasette/issues/1852#issuecomment-1289774183 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M4GRn | simonw 9599 | 2022-10-24T23:25:52Z | 2022-10-24T23:25:52Z | OWNER | ... also, maybe there should be a UI (perhaps on that page) for resetting the Datasette secret? Useful for emergency invalidation of all tokens. No, I'm not going to build that unless someone asks for it. Restarting the server with a fresh secret should be easy enough. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Default API token authentication mechanism 1421552095 | |
504662987 | https://github.com/simonw/datasette/issues/514#issuecomment-504662987 | https://api.github.com/repos/simonw/datasette/issues/514 | MDEyOklzc3VlQ29tbWVudDUwNDY2Mjk4Nw== | simonw 9599 | 2019-06-22T12:46:39Z | 2019-06-22T12:46:39Z | OWNER | ... and @russss also suggested systemd 21 seconds before I posted that! | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Documentation with recommendations on running Datasette in production without using Docker 459397625 | |
640157216 | https://github.com/simonw/datasette/issues/808#issuecomment-640157216 | https://api.github.com/repos/simonw/datasette/issues/808 | MDEyOklzc3VlQ29tbWVudDY0MDE1NzIxNg== | simonw 9599 | 2020-06-07T04:58:40Z | 2020-06-07T04:58:40Z | OWNER | ... and I want a unit test which confirms that all permissions are documented. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Permission check for every view in Datasette (plus docs) 632918799 | |
1271803298 | https://github.com/simonw/datasette/pull/1838#issuecomment-1271803298 | https://api.github.com/repos/simonw/datasette/issues/1838 | IC_kwDOBm6k_c5Lzi2i | simonw 9599 | 2022-10-07T16:28:41Z | 2022-10-07T16:28:41Z | OWNER | ... and here's @ocdtrekkie's plugin! https://github.com/ocdtrekkie/datasette-external-links-new-tabs | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Open Datasette link in new tab 1400494162 | |
1356610089 | https://github.com/simonw/datasette/issues/1955#issuecomment-1356610089 | https://api.github.com/repos/simonw/datasette/issues/1955 | IC_kwDOBm6k_c5Q3Dop | simonw 9599 | 2022-12-18T01:12:39Z | 2022-12-18T01:12:39Z | OWNER | ... and it turns out those tests saved me. Because I forgot to check if `datasette` would actually start a server correctly! ``` % datasette fixtures.db -p 8852 INFO: Started server process [3538] INFO: Waiting for application startup. ERROR: Exception in 'lifespan' protocol Traceback (most recent call last): File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/uvicorn/lifespan/on.py", line 86, in main await app(scope, self.receive, self.send) File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 78, in __call__ return await self.app(scope, receive, send) File "/Users/simon/Dropbox/Development/datasette/datasette/utils/asgi.py", line 437, in __call__ return await self.asgi(scope, receive, send) File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/asgi_csrf.py", line 39, in app_wrapped_with_csrf await app(scope, receive, send) File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1457, in __call__ path = scope["path"] KeyError: 'path' ERROR: Application startup failed. Exiting. ``` | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | invoke_startup() is not run in some conditions, e.g. gunicorn/uvicorn workers, breaking lots of things 1496652622 | |
603600553 | https://github.com/simonw/datasette/issues/705#issuecomment-603600553 | https://api.github.com/repos/simonw/datasette/issues/705 | MDEyOklzc3VlQ29tbWVudDYwMzYwMDU1Mw== | simonw 9599 | 2020-03-25T02:11:56Z | 2020-03-25T02:12:09Z | OWNER | ... and set up the CNAME record: $ now dns add datasette.io latest CNAME ghs.googlehosted.com. Got an error: > Error! A conflicting record exists "rec_e4c36ae94cf0a2b7b1781329". | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | latest.datasette.io is no longer updating 585626199 | |
803774518 | https://github.com/simonw/datasette/issues/1268#issuecomment-803774518 | https://api.github.com/repos/simonw/datasette/issues/1268 | MDEyOklzc3VlQ29tbWVudDgwMzc3NDUxOA== | simonw 9599 | 2021-03-22T05:34:57Z | 2021-03-22T05:34:57Z | OWNER | ... and sure enough, adding this code fixed the problem: ```diff diff --git a/datasette/database.py b/datasette/database.py index 3579cce..b466b12 100644 --- a/datasette/database.py +++ b/datasette/database.py @@ -224,6 +226,9 @@ class Database: # Try to get counts for each table, $limit timeout for each count counts = {} for table in await self.table_names(): + if table == "SpatialIndex": + counts[table] = 0 + continue try: table_count = ( await self.execute( ``` | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Figure out why SpatiaLite 5.0 hangs the database page on Linux 837308703 | |
973700549 | https://github.com/simonw/datasette/issues/1518#issuecomment-973700549 | https://api.github.com/repos/simonw/datasette/issues/1518 | IC_kwDOBm6k_c46CX3F | simonw 9599 | 2021-11-19T03:31:20Z | 2021-11-19T03:31:26Z | OWNER | ... and while I'm doing all of this I can rewrite the templates to not use those cheating magical functions AND document the template context at the same time, refs: - #1510. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Complete refactor of TableView and table.html template 1058072543 | |
1356640463 | https://github.com/simonw/datasette/issues/1955#issuecomment-1356640463 | https://api.github.com/repos/simonw/datasette/issues/1955 | IC_kwDOBm6k_c5Q3LDP | simonw 9599 | 2022-12-18T02:45:18Z | 2022-12-18T02:45:18Z | OWNER | ... and with this change, the following now works correctly: ``` % datasette install datasette-gunicorn % datasette gunicorn fixtures.db -p 8855 [2022-12-17 18:44:29 -0800] [7651] [INFO] Starting gunicorn 20.1.0 [2022-12-17 18:44:29 -0800] [7651] [INFO] Listening at: http://127.0.0.1:8855 (7651) [2022-12-17 18:44:29 -0800] [7651] [INFO] Using worker: uvicorn.workers.UvicornWorker [2022-12-17 18:44:29 -0800] [7653] [INFO] Booting worker with pid: 7653 [2022-12-17 18:44:29 -0800] [7653] [INFO] Started server process [7653] [2022-12-17 18:44:29 -0800] [7653] [INFO] Waiting for application startup. [2022-12-17 18:44:29 -0800] [7653] [INFO] Application startup complete. ``` So this issue is now fixed! | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | invoke_startup() is not run in some conditions, e.g. gunicorn/uvicorn workers, breaking lots of things 1496652622 | |
779446652 | https://github.com/simonw/sqlite-utils/issues/147#issuecomment-779446652 | https://api.github.com/repos/simonw/sqlite-utils/issues/147 | MDEyOklzc3VlQ29tbWVudDc3OTQ0NjY1Mg== | simonw 9599 | 2021-02-15T21:04:19Z | 2021-02-15T21:04:19Z | OWNER | ... but it looks like `batch_size` is hard-coded to 100, rather than `None` - which means it's not being calculated using that value: https://github.com/simonw/sqlite-utils/blob/1f49f32814a942fa076cfe5f504d1621188097ed/sqlite_utils/db.py#L704 And https://github.com/simonw/sqlite-utils/blob/1f49f32814a942fa076cfe5f504d1621188097ed/sqlite_utils/db.py#L1877 | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | SQLITE_MAX_VARS maybe hard-coded too low 688670158 | |
1224283367 | https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224283367 | https://api.github.com/repos/simonw/sqlite-utils/issues/467 | IC_kwDOCGYnMM5I-RTn | simonw 9599 | 2022-08-23T16:05:55Z | 2022-08-23T16:05:55Z | OWNER | ... but that's what the `table.transform(...)` method does already! So maybe this is actually a `transform=True` parameter to `create()` that triggers `table.transform(...)` if necessary. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Mechanism for ensuring a table has all the columns 1348169997 | |
1331204360 | https://github.com/simonw/datasette/issues/1913#issuecomment-1331204360 | https://api.github.com/repos/simonw/datasette/issues/1913 | IC_kwDOBm6k_c5PWJEI | simonw 9599 | 2022-11-29T19:47:40Z | 2022-11-29T19:47:40Z | OWNER | ... but the last step of the deploy failed, when it was meant to push to PyPI! ``` Uploading distributions to https://upload.pypi.org/legacy/ Traceback (most recent call last): File "/opt/hostedtoolcache/Python/3.11.0/x64/bin/twine", line 8, in <module> sys.exit(main()) ^^^^^^ File "/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/__main__.py", line 33, in main error = cli.dispatch(sys.argv[1:]) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/cli.py", line 123, in dispatch return main(args.args) ^^^^^^^^^^^^^^^ File "/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/commands/upload.py", line 198, in main return upload(upload_settings, parsed_args.dists) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/commands/upload.py", line 123, in upload packages_to_upload = [ ^ File "/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/commands/upload.py", line 124, in <listcomp> _make_package(filename, signatures, upload_settings) for filename in uploads ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/commands/upload.py", line 77, in _make_package package = package_file.PackageFile.from_filename(filename, upload_settings.comment) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/package.py", line 96, in from_filename meta = DIST_TYPES[dtype](filename) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/wheel.py", line 42, in __init__ self.extractMetadata() File "/opt/hostedtoolcache/Python/3.11.0/x64/… | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Release Datasette 1.0a0 1468603401 | |
586109784 | https://github.com/simonw/datasette/pull/672#issuecomment-586109784 | https://api.github.com/repos/simonw/datasette/issues/672 | MDEyOklzc3VlQ29tbWVudDU4NjEwOTc4NA== | simonw 9599 | 2020-02-14T05:53:50Z | 2020-02-14T05:54:21Z | OWNER | ... cheating like this seems to work: ``` for name, db in list(self.ds.databases.items()): ``` Python built-in operations are supposedly threadsafe, so in this case I can grab a copy of the list atomically (I think) and then safely iterate over it. Seems to work in my testing. Wish I could prove it with a unit test though. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | --dirs option for scanning directories for SQLite databases 565064079 | |
803748469 | https://github.com/simonw/datasette/issues/1249#issuecomment-803748469 | https://api.github.com/repos/simonw/datasette/issues/1249 | MDEyOklzc3VlQ29tbWVudDgwMzc0ODQ2OQ== | simonw 9599 | 2021-03-22T04:17:51Z | 2021-03-22T04:17:51Z | OWNER | ... except my clever image using SpatiaLite installed for Ubuntu doesn't actually work: ``` datasette % docker run -p 8001:8001 -v `pwd`:/mnt datasette-spatialite:latest datasette -p 8001 -h 0.0.0.0 /mnt/fixtures.db File "/usr/local/lib/python3.9/sqlite3/dbapi2.py", line 27, in <module> from _sqlite3 import * ImportError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by /usr/lib/x86_64-linux-gnu/libsqlite3.so.0) ``` | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Updated Dockerfile with SpatiaLite version 5.0 824064069 | |
997472509 | https://github.com/simonw/datasette/issues/1565#issuecomment-997472509 | https://api.github.com/repos/simonw/datasette/issues/1565 | IC_kwDOBm6k_c47dDj9 | simonw 9599 | 2021-12-19T22:24:50Z | 2021-12-19T22:24:50Z | OWNER | ... huh, it could even expose a JavaScript function that can be called to execute a SQL query. ```javascript datasette.query("select * from blah").then(...) ``` Maybe it takes an optional second argument that specifies the database - defaulting to the one for the current page. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Documented JavaScript variables on different templates made available for plugins 1083657868 | |
696302020 | https://github.com/simonw/datasette/issues/971#issuecomment-696302020 | https://api.github.com/repos/simonw/datasette/issues/971 | MDEyOklzc3VlQ29tbWVudDY5NjMwMjAyMA== | simonw 9599 | 2020-09-21T18:49:09Z | 2020-09-21T18:49:09Z | OWNER | ... made harder to work on because I apparently don't have the `DBSTAT_VTAB` module on macOS. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Support the dbstat table 705827457 | |
1068445412 | https://github.com/simonw/datasette/issues/1509#issuecomment-1068445412 | https://api.github.com/repos/simonw/datasette/issues/1509 | IC_kwDOBm6k_c4_ry7k | simonw 9599 | 2022-03-15T20:37:50Z | 2022-03-15T20:38:56Z | OWNER | ... maybe Datasette itself should include interactive API documentation, in addition to documenting it in the manual? `/dbname/table/-/apidocs` could return documentation about the specific table, taking into account columns and types. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Datasette 1.0 JSON API (and documentation) 1054243511 | |
1185931417 | https://github.com/simonw/datasette/issues/1770#issuecomment-1185931417 | https://api.github.com/repos/simonw/datasette/issues/1770 | IC_kwDOBm6k_c5Gr-CZ | simonw 9599 | 2022-07-15T20:59:25Z | 2022-07-15T20:59:25Z | OWNER | ... maybe it should take `send`? But then how would plugins know that another plugin hadn't already used `send` to send a response, and avoid two trying to send at the same time? | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | `handle_exception` plugin hook for custom error handling 1306492437 | |
719810533 | https://github.com/simonw/datasette/issues/1072#issuecomment-719810533 | https://api.github.com/repos/simonw/datasette/issues/1072 | MDEyOklzc3VlQ29tbWVudDcxOTgxMDUzMw== | simonw 9599 | 2020-10-30T21:34:38Z | 2020-10-30T21:34:38Z | OWNER | ... no wait, my comments above assume that I'm just building the `datasette-edit-templates` plugin. Does this work as a general solution for all of Datasette? I don't think it does. This may mean I need to delay the whole feature. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | load_template hook doesn't work for include/extends 733499930 | |
586109238 | https://github.com/simonw/datasette/pull/672#issuecomment-586109238 | https://api.github.com/repos/simonw/datasette/issues/672 | MDEyOklzc3VlQ29tbWVudDU4NjEwOTIzOA== | simonw 9599 | 2020-02-14T05:51:12Z | 2020-02-14T05:51:12Z | OWNER | ... or maybe I can cheat and wrap the access to `self.ds.databases.items()` in `list()`, so I'm iterating over an atomically-created list of those things instead? I'll try that first. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | --dirs option for scanning directories for SQLite databases 565064079 | |
1291111357 | https://github.com/simonw/sqlite-utils/issues/503#issuecomment-1291111357 | https://api.github.com/repos/simonw/sqlite-utils/issues/503 | IC_kwDOCGYnMM5M9Mu9 | simonw 9599 | 2022-10-25T20:36:06Z | 2022-10-25T20:36:06Z | OWNER | ... or maybe Windows doesn't like attempts to remove a file that the process has opened? | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | test_recreate failing on Windows Python 3.11 1423000702 | |
1291232589 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291232589 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M9qVN | simonw 9599 | 2022-10-25T23:08:37Z | 2022-10-25T23:08:37Z | OWNER | ... so maybe there's a way to create a token that inherits the exact permissions of the actor that created the token? That could even be a default mode for tokens, with an option to then further restrict permissions if desired. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Default API token authentication mechanism 1421552095 | |
813134386 | https://github.com/simonw/datasette/issues/1293#issuecomment-813134386 | https://api.github.com/repos/simonw/datasette/issues/1293 | MDEyOklzc3VlQ29tbWVudDgxMzEzNDM4Ng== | simonw 9599 | 2021-04-05T01:20:28Z | 2021-08-13T00:42:30Z | OWNER | ... that output might also provide a better way to extract variables than the current mechanism using a regular expression, by looking for the `Variable` opcodes. [UPDATE: it did indeed do that, see #1421] | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Show column metadata plus links for foreign keys on arbitrary query results 849978964 | |
880153069 | https://github.com/simonw/datasette/issues/268#issuecomment-880153069 | https://api.github.com/repos/simonw/datasette/issues/268 | MDEyOklzc3VlQ29tbWVudDg4MDE1MzA2OQ== | simonw 9599 | 2021-07-14T19:31:00Z | 2021-07-14T19:31:00Z | OWNER | ... though interestingly I can't replicate that error on `latest.datasette.io` - https://latest.datasette.io/fixtures/searchable?_search=park.&_searchmode=raw That's running https://latest.datasette.io/-/versions SQLite 3.35.4 whereas https://www.niche-museums.com/-/versions is running 3.27.2 (the most recent version available with Vercel) - but there's nothing in the SQLite changelog between those two versions that suggests changes to how the FTS5 parser works. https://www.sqlite.org/changes.html | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Mechanism for ranking results from SQLite full-text search 323718842 | |
782747878 | https://github.com/simonw/datasette/issues/782#issuecomment-782747878 | https://api.github.com/repos/simonw/datasette/issues/782 | MDEyOklzc3VlQ29tbWVudDc4Mjc0Nzg3OA== | simonw 9599 | 2021-02-20T20:53:11Z | 2021-02-20T20:53:11Z | OWNER | ... though thinking about this further, I could re-implement the `select * from commits` (but only return a max of 10 results) feature using a nested `select * from (select * from commits) limit 10` query. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Redesign default .json format 627794879 | |
712482015 | https://github.com/simonw/datasette/issues/1020#issuecomment-712482015 | https://api.github.com/repos/simonw/datasette/issues/1020 | MDEyOklzc3VlQ29tbWVudDcxMjQ4MjAxNQ== | simonw 9599 | 2020-10-19T22:43:24Z | 2020-10-19T22:43:24Z | OWNER | ... unless I want to support authentication mechanisms that work based on incoming IP address instead, in which case there's an argument for copying more over from the incoming request. Tailscale is a good example of a system where authentication based on IP address can actually work well, so this is worth doing. Also, there might be authentication mechanisms which work by setting a custom header on the incoming request (not to mention the `Authorization` header). | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Method for datasette.client() to forward on authentication 721068929 | |
1072907680 | https://github.com/simonw/datasette/issues/1228#issuecomment-1072907680 | https://api.github.com/repos/simonw/datasette/issues/1228 | IC_kwDOBm6k_c4_80Wg | simonw 9599 | 2022-03-19T00:55:48Z | 2022-03-19T00:55:48Z | OWNER | ... unless your data had a column called `n`? | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | 500 error caused by faceting if a column called `n` exists 810397025 | |
1324531750 | https://github.com/simonw/datasette/issues/1863#issuecomment-1324531750 | https://api.github.com/repos/simonw/datasette/issues/1863 | IC_kwDOBm6k_c5O8sAm | simonw 9599 | 2022-11-23T04:20:47Z | 2022-11-23T04:20:47Z | OWNER | ... which does imply that I'm going to do an extra layer of validation over what SQLite provides. SQLite will happily allow a text string to be added to a supposedly integer column. I'm not going to allow that - I'll return a validation error instead, unless the string can be safely coerced to the correct type. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Update a single record in an existing table 1425029242 | |
381799408 | https://github.com/simonw/datasette/issues/216#issuecomment-381799408 | https://api.github.com/repos/simonw/datasette/issues/216 | MDEyOklzc3VlQ29tbWVudDM4MTc5OTQwOA== | simonw 9599 | 2018-04-17T01:22:30Z | 2018-04-17T01:22:30Z | OWNER | ... which is VERY surprising, because `3.23.0` only came out on 2nd April this year: https://www.sqlite.org/changes.html - I have no idea how I came to be running that version on my laptop. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Bug: Sort by column with NULL in next_page URL 314665147 | |
548055544 | https://github.com/simonw/datasette/issues/607#issuecomment-548055544 | https://api.github.com/repos/simonw/datasette/issues/607 | MDEyOklzc3VlQ29tbWVudDU0ODA1NTU0NA== | simonw 9599 | 2019-10-30T18:37:44Z | 2019-10-30T18:37:52Z | OWNER | .Hi @zeluspudding You're running your search queries using the "contains" filter, which uses a `like` query under the hood. SQL `like` queries are generally slow because they force a full table scan. You can add an index on the column but it will only speed up prefix queries, like `... where name like 'apple%'` - they won't help if you are searching for text further along the string. Instead, you should take a look at SQLite's FTS - full text indexing feature. You can build a FTS index against a column and dramatically speed up searches for words within that column. This documentation should help get you started: https://datasette.readthedocs.io/en/stable/full_text_search.html | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Ways to improve fuzzy search speed on larger data sets? 512996469 | |
905900807 | https://github.com/simonw/datasette/issues/859#issuecomment-905900807 | https://api.github.com/repos/simonw/datasette/issues/859 | IC_kwDOBm6k_c41_vMH | simonw 9599 | 2021-08-25T21:51:10Z | 2021-08-25T21:51:10Z | OWNER | 10-20 minutes to populate `_internal`! How many databases and tables is that for? I may have to rethink the `_internal` mechanism entirely. One possible alternative would be for the Datasette homepage to just show a list of available databases (maybe only if there are more than X connected) and then load in their metadata only the first time they are accessed. I need to get my own stress testing rig setup for this. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Database page loads too slowly with many large tables (due to table counts) 642572841 | |
752759885 | https://github.com/simonw/datasette/issues/983#issuecomment-752759885 | https://api.github.com/repos/simonw/datasette/issues/983 | MDEyOklzc3VlQ29tbWVudDc1Mjc1OTg4NQ== | simonw 9599 | 2020-12-30T21:11:52Z | 2020-12-30T21:14:00Z | OWNER | 262 bytes if I remove the parameter introspection code, instead requiring plugin authors to specify the arguments they take: ```javascript window.datasette = window.datasette || {}; window.datasette.plugins = (() => { var registry = {}; return { register: (hook, fn, parameters) => { if (!registry[hook]) { registry[hook] = []; } registry[hook].push([fn, parameters]); }, call: (hook, args) => { args = args || {}; var results = []; (registry[hook] || []).forEach(([fn, parameters]) => { /* Call with the correct arguments */ var callWith = parameters.map(parameter => args[parameter]); var result = fn.apply(fn, callWith); if (result) { results.push(result); } }); return results; } }; })(); ``` `window.datasette=window.datasette||{},window.datasette.plugins=(()=>{var a={};return{register:(t,e,r)=>{a[t]||(a[t]=[]),a[t].push([e,r])},call:(t,e)=>{e=e||{};var r=[];return(a[t]||[]).forEach(([a,t])=>{var s=t.map(a=>e[a]),d=a.apply(a,s);d&&r.push(d)}),r}}})();` | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | JavaScript plugin hooks mechanism similar to pluggy 712260429 | |
864594956 | https://github.com/simonw/sqlite-utils/issues/286#issuecomment-864594956 | https://api.github.com/repos/simonw/sqlite-utils/issues/286 | MDEyOklzc3VlQ29tbWVudDg2NDU5NDk1Ng== | simonw 9599 | 2021-06-20T18:38:05Z | 2021-06-20T18:38:05Z | OWNER | 3.10 is out in Homebrew now (they turn that around so fast): https://formulae.brew.sh/formula/sqlite-utils | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Add installation instructions 925487946 | |
771975941 | https://github.com/simonw/datasette/issues/1212#issuecomment-771975941 | https://api.github.com/repos/simonw/datasette/issues/1212 | MDEyOklzc3VlQ29tbWVudDc3MTk3NTk0MQ== | simonw 9599 | 2021-02-02T20:52:36Z | 2021-02-02T20:52:36Z | OWNER | 37 minutes, wow! They're a little slow for me (4-5 minutes perhaps) but not nearly that bad. Thanks for running that profile. I think you're right: figuring out how to use more session scopes would definitely help. The `:memory:` idea is interesting too. The new `memory_name=` feature added in #1151 (released in Datasette 0.54) could help a lot here, since it allows Datasette instances to share the same in-memory database across multiple HTTP requests and connections. Note that `memory_name=` also persists within test runs themselves, independently of any `scope=` options on the fixtures. That might actually help us here! I'd be delighted if you explored this issue further, especially the option of using `memory_name=` for the fixtures databases used by the tests. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Tests are very slow. 797651831 | |
852706970 | https://github.com/simonw/datasette/issues/619#issuecomment-852706970 | https://api.github.com/repos/simonw/datasette/issues/619 | MDEyOklzc3VlQ29tbWVudDg1MjcwNjk3MA== | simonw 9599 | 2021-06-02T04:15:54Z | 2021-06-02T04:15:54Z | OWNER | <img width="1009" alt="fixtures__select___from__foo__and_Facets_should_not_execute_for__shape_array_object_·_Issue__263_·_simonw_datasette" src="https://user-images.githubusercontent.com/9599/120423073-8a338700-c31e-11eb-8c8f-affc24708b32.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | "Invalid SQL" page should let you edit the SQL 520655983 | |
997262475 | https://github.com/simonw/datasette/issues/1555#issuecomment-997262475 | https://api.github.com/repos/simonw/datasette/issues/1555 | IC_kwDOBm6k_c47cQSL | simonw 9599 | 2021-12-18T18:34:18Z | 2021-12-18T18:34:18Z | OWNER | <img width="1055" alt="image" src="https://user-images.githubusercontent.com/9599/146652142-1c0bc34e-4a18-407d-bd59-28d565b631a6.png"> Using `executescript=True` that call now takes 1.89ms to create all of those tables. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Optimize all those calls to index_list and foreign_key_list 1079149656 | |
803777724 | https://github.com/simonw/datasette/issues/1268#issuecomment-803777724 | https://api.github.com/repos/simonw/datasette/issues/1268 | MDEyOklzc3VlQ29tbWVudDgwMzc3NzcyNA== | simonw 9599 | 2021-03-22T05:42:50Z | 2021-03-22T05:43:23Z | OWNER | <img width="1129" alt="tuscany_housenumbers__select___from_sqlite_master_where_sql_like__create_virtual_table__" src="https://user-images.githubusercontent.com/9599/111945249-99809380-8a96-11eb-871b-9a1509360bcf.png"> If I want to avoid counting virtual tables, I need to detect which tables are virtual tables. The safest way to do this is probably to pull the `sql` for every table and then, in Python, check for values that start with `create virtual table` after converting to lower case, using any number of spaces. This would catch things like ` CREATE virtual TABLE` which might be missed by a SQL `like` query. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Figure out why SpatiaLite 5.0 hangs the database page on Linux 837308703 | |
603599677 | https://github.com/simonw/datasette/issues/705#issuecomment-603599677 | https://api.github.com/repos/simonw/datasette/issues/705 | MDEyOklzc3VlQ29tbWVudDYwMzU5OTY3Nw== | simonw 9599 | 2020-03-25T02:08:11Z | 2020-03-25T02:08:11Z | OWNER | <img width="1197" alt="Webmaster_Central" src="https://user-images.githubusercontent.com/9599/77494367-cb6b0580-6e02-11ea-8cb3-8de1353d7d3e.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | latest.datasette.io is no longer updating 585626199 | |
651293559 | https://github.com/simonw/datasette/issues/875#issuecomment-651293559 | https://api.github.com/repos/simonw/datasette/issues/875 | MDEyOklzc3VlQ29tbWVudDY1MTI5MzU1OQ== | simonw 9599 | 2020-06-29T18:43:50Z | 2020-06-29T18:43:50Z | OWNER | <img width="470" alt="_memory_" src="https://user-images.githubusercontent.com/9599/86043599-ca4b0500-b9fd-11ea-9378-a053e96cfde7.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | "Logged in as: XXX - logout" navigation item 647103735 | |
346682905 | https://github.com/simonw/datasette/issues/146#issuecomment-346682905 | https://api.github.com/repos/simonw/datasette/issues/146 | MDEyOklzc3VlQ29tbWVudDM0NjY4MjkwNQ== | simonw 9599 | 2017-11-23T18:55:08Z | 2017-11-23T18:55:08Z | OWNER | <img width="478" alt="compute_engine_-_simonwillisonblog" src="https://user-images.githubusercontent.com/9599/33186224-c3e32d44-d03c-11e7-9cd8-6acc6c1d1d01.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | datasette publish gcloud 276455748 | |
346691243 | https://github.com/simonw/datasette/issues/86#issuecomment-346691243 | https://api.github.com/repos/simonw/datasette/issues/86 | MDEyOklzc3VlQ29tbWVudDM0NjY5MTI0Mw== | simonw 9599 | 2017-11-23T20:07:15Z | 2017-11-23T20:07:15Z | OWNER | <img width="566" alt="fivethirtyeight__bob-ross_elements-by-episode_csv" src="https://user-images.githubusercontent.com/9599/33187492-d6fb6068-d046-11e7-80fc-470c04a46386.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Filter UI on table page 273703829 | |
703928029 | https://github.com/simonw/datasette/issues/993#issuecomment-703928029 | https://api.github.com/repos/simonw/datasette/issues/993 | MDEyOklzc3VlQ29tbWVudDcwMzkyODAyOQ== | simonw 9599 | 2020-10-05T22:42:45Z | 2020-10-05T22:42:59Z | OWNER | <img width="574" alt="fixtures__facetable__15_rows" src="https://user-images.githubusercontent.com/9599/95139485-65e8c180-0721-11eb-9e91-263aad6f6846.png"> The `NOT NULL` text shows up only for columns that are not null. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Column action menu should show column type 715072935 | |
339866724 | https://github.com/simonw/datasette/issues/41#issuecomment-339866724 | https://api.github.com/repos/simonw/datasette/issues/41 | MDEyOklzc3VlQ29tbWVudDMzOTg2NjcyNA== | simonw 9599 | 2017-10-27T04:04:52Z | 2017-10-27T04:04:52Z | OWNER | <img width="624" alt="databases" src="https://user-images.githubusercontent.com/9599/32087550-4e10b8a4-ba91-11e7-992b-e628d77114d0.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Homepage should show summary of databases 268590777 | |
1097068474 | https://github.com/simonw/datasette/issues/1712#issuecomment-1097068474 | https://api.github.com/repos/simonw/datasette/issues/1712 | IC_kwDOBm6k_c5BY--6 | simonw 9599 | 2022-04-12T18:38:18Z | 2022-04-12T18:38:18Z | OWNER | <img width="633" alt="image" src="https://user-images.githubusercontent.com/9599/163030785-9dcc5a21-6a1b-42a7-97de-10e7d2874412.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Make "<Binary: 2427344 bytes>" easier to read 1202227104 | |
346902583 | https://github.com/simonw/datasette/issues/133#issuecomment-346902583 | https://api.github.com/repos/simonw/datasette/issues/133 | MDEyOklzc3VlQ29tbWVudDM0NjkwMjU4Mw== | simonw 9599 | 2017-11-24T22:30:32Z | 2017-11-24T22:30:32Z | OWNER | <img width="662" alt="sf-trees__street_tree_list__1_row_where_search_matches__ocean___qcareassistant____1__qcareassistant_is_not_blank_and_qlegalstatus___1" src="https://user-images.githubusercontent.com/9599/33224944-03bf054a-d124-11e7-8a97-58c8dee892a1.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | If view is filtered, search should apply within those filtered rows 275176006 | |
622999623 | https://github.com/simonw/datasette/issues/750#issuecomment-622999623 | https://api.github.com/repos/simonw/datasette/issues/750 | MDEyOklzc3VlQ29tbWVudDYyMjk5OTYyMw== | simonw 9599 | 2020-05-02T19:05:07Z | 2020-05-02T19:05:07Z | OWNER | <img width="672" alt="data__names__5_rows_where_where_name_not_like__Sim___sorted_by_rowid" src="https://user-images.githubusercontent.com/9599/80873394-116e8100-8c6d-11ea-9814-5ae66d3ba869.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Add notlike table filter 611252244 | |
344786528 | https://github.com/simonw/datasette/issues/96#issuecomment-344786528 | https://api.github.com/repos/simonw/datasette/issues/96 | MDEyOklzc3VlQ29tbWVudDM0NDc4NjUyOA== | simonw 9599 | 2017-11-16T01:32:41Z | 2017-11-16T01:32:41Z | OWNER | <img width="733" alt="australian-dogs" src="https://user-images.githubusercontent.com/9599/32869280-f82fa176-ca2a-11e7-8ad1-ac2a13c85089.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | UI for editing named parameters 274001453 | |
346900554 | https://github.com/simonw/datasette/issues/147#issuecomment-346900554 | https://api.github.com/repos/simonw/datasette/issues/147 | MDEyOklzc3VlQ29tbWVudDM0NjkwMDU1NA== | simonw 9599 | 2017-11-24T22:02:22Z | 2017-11-24T22:02:22Z | OWNER | <img width="798" alt="conventional_power_plants_eu__conventional_power_plants_eu__14_rows_where_company____nuon_" src="https://user-images.githubusercontent.com/9599/33224603-15e7a406-d120-11e7-89c1-32d3d0aff021.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Tidy up design of the header of the table page 276476670 | |
346701751 | https://github.com/simonw/datasette/issues/132#issuecomment-346701751 | https://api.github.com/repos/simonw/datasette/issues/132 | MDEyOklzc3VlQ29tbWVudDM0NjcwMTc1MQ== | simonw 9599 | 2017-11-23T21:51:51Z | 2017-11-23T21:51:51Z | OWNER | <img width="846" alt="fatal-police-shootings-data__fatal-police-shootings-data" src="https://user-images.githubusercontent.com/9599/33189202-73891af2-d055-11e7-9e79-6be7d8df36aa.png"> | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Row view is not currently expanding foreign keys 275175929 | |
733247101 | https://github.com/simonw/datasette/issues/1106#issuecomment-733247101 | https://api.github.com/repos/simonw/datasette/issues/1106 | MDEyOklzc3VlQ29tbWVudDczMzI0NzEwMQ== | simonw 9599 | 2020-11-24T21:35:29Z | 2020-11-24T21:36:04Z | OWNER | <img width="861" alt="Edit_Redirects___Read_the_Docs" src="https://user-images.githubusercontent.com/9599/100153884-a3341a80-2e59-11eb-8d8c-7027c714b9cf.png"> https://docs.datasette.io/en/latest/config.html isn't redirecting though, even after I tried running a rebuild of the `latest` version. | {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} | Rebrand and redirect config.rst as settings.rst 749983857 |
Advanced export
JSON shape: default, array, newline-delimited, object
CREATE TABLE [issue_comments] ( [html_url] TEXT, [issue_url] TEXT, [id] INTEGER PRIMARY KEY, [node_id] TEXT, [user] INTEGER REFERENCES [users]([id]), [created_at] TEXT, [updated_at] TEXT, [author_association] TEXT, [body] TEXT, [reactions] TEXT, [issue] INTEGER REFERENCES [issues]([id]) , [performed_via_github_app] TEXT); CREATE INDEX [idx_issue_comments_issue] ON [issue_comments] ([issue]); CREATE INDEX [idx_issue_comments_user] ON [issue_comments] ([user]);
updated_at (date) >30 ✖