github
html_url | issue_url | id | node_id | user | created_at | updated_at | author_association | body | reactions | issue | performed_via_github_app |
---|---|---|---|---|---|---|---|---|---|---|---|
https://github.com/simonw/datasette/issues/682#issuecomment-590399600 | https://api.github.com/repos/simonw/datasette/issues/682 | 590399600 | MDEyOklzc3VlQ29tbWVudDU5MDM5OTYwMA== | 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 } |
569613563 | |
https://github.com/simonw/datasette/issues/1708#issuecomment-1095687566 | https://api.github.com/repos/simonw/datasette/issues/1708 | 1095687566 | IC_kwDOBm6k_c5BTt2O | 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 } |
1200649124 | |
https://github.com/simonw/datasette/issues/1160#issuecomment-752257666 | https://api.github.com/repos/simonw/datasette/issues/1160 | 752257666 | MDEyOklzc3VlQ29tbWVudDc1MjI1NzY2Ng== | 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 } |
775666296 | |
https://github.com/simonw/datasette/issues/1026#issuecomment-719959754 | https://api.github.com/repos/simonw/datasette/issues/1026 | 719959754 | MDEyOklzc3VlQ29tbWVudDcxOTk1OTc1NA== | 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 } |
722738988 | |
https://github.com/simonw/datasette/issues/1152#issuecomment-749750995 | https://api.github.com/repos/simonw/datasette/issues/1152 | 749750995 | MDEyOklzc3VlQ29tbWVudDc0OTc1MDk5NQ== | 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 } |
770598024 | |
https://github.com/simonw/datasette/issues/1269#issuecomment-804261610 | https://api.github.com/repos/simonw/datasette/issues/1269 | 804261610 | MDEyOklzc3VlQ29tbWVudDgwNDI2MTYxMA== | 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 } |
837348479 | |
https://github.com/simonw/datasette/issues/520#issuecomment-504852873 | https://api.github.com/repos/simonw/datasette/issues/520 | 504852873 | MDEyOklzc3VlQ29tbWVudDUwNDg1Mjg3Mw== | 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 } |
459598080 | |
https://github.com/dogsheep/google-takeout-to-sqlite/issues/6#issuecomment-790384087 | https://api.github.com/repos/dogsheep/google-takeout-to-sqlite/issues/6 | 790384087 | MDEyOklzc3VlQ29tbWVudDc5MDM4NDA4Nw== | 9599 | 2021-03-04T07:22:51Z | 2021-03-04T07:22:51Z | MEMBER | #3 also mentions the conflicting version with other tools. | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
821841046 | |
https://github.com/simonw/datasette/issues/830#issuecomment-720700065 | https://api.github.com/repos/simonw/datasette/issues/830 | 720700065 | MDEyOklzc3VlQ29tbWVudDcyMDcwMDA2NQ== | 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 } |
636511683 | |
https://github.com/simonw/datasette/pull/595#issuecomment-552276237 | https://api.github.com/repos/simonw/datasette/issues/595 | 552276237 | MDEyOklzc3VlQ29tbWVudDU1MjI3NjIzNw== | 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 } |
506300941 | |
https://github.com/simonw/datasette/issues/594#issuecomment-552276247 | https://api.github.com/repos/simonw/datasette/issues/594 | 552276247 | MDEyOklzc3VlQ29tbWVudDU1MjI3NjI0Nw== | 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 } |
506297048 | |
https://github.com/simonw/datasette/pull/404#issuecomment-552276277 | https://api.github.com/repos/simonw/datasette/issues/404 | 552276277 | MDEyOklzc3VlQ29tbWVudDU1MjI3NjI3Nw== | 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 } |
403499298 | |
https://github.com/simonw/datasette/issues/1518#issuecomment-981172801 | https://api.github.com/repos/simonw/datasette/issues/1518 | 981172801 | IC_kwDOBm6k_c46e4JB | 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 } |
1058072543 | |
https://github.com/simonw/datasette/issues/1779#issuecomment-1214414320 | https://api.github.com/repos/simonw/datasette/issues/1779 | 1214414320 | IC_kwDOBm6k_c5IYn3w | 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 } |
1334628400 | |
https://github.com/simonw/sqlite-utils/issues/349#issuecomment-987349633 | https://api.github.com/repos/simonw/sqlite-utils/issues/349 | 987349633 | IC_kwDOCGYnMM462cKB | 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 } |
1071531082 | |
https://github.com/simonw/datasette/issues/1729#issuecomment-1112717745 | https://api.github.com/repos/simonw/datasette/issues/1729 | 1112717745 | IC_kwDOBm6k_c5CUrmx | 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 } |
1219385669 | |
https://github.com/simonw/datasette/issues/782#issuecomment-782747164 | https://api.github.com/repos/simonw/datasette/issues/782 | 782747164 | MDEyOklzc3VlQ29tbWVudDc4Mjc0NzE2NA== | 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 } |
627794879 | |
https://github.com/simonw/datasette/issues/782#issuecomment-691526489 | https://api.github.com/repos/simonw/datasette/issues/782 | 691526489 | MDEyOklzc3VlQ29tbWVudDY5MTUyNjQ4OQ== | 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 } |
627794879 | |
https://github.com/simonw/datasette/issues/581#issuecomment-634946319 | https://api.github.com/repos/simonw/datasette/issues/581 | 634946319 | MDEyOklzc3VlQ29tbWVudDYzNDk0NjMxOQ== | 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 } |
502993509 | |
https://github.com/simonw/datasette/issues/581#issuecomment-634964457 | https://api.github.com/repos/simonw/datasette/issues/581 | 634964457 | MDEyOklzc3VlQ29tbWVudDYzNDk2NDQ1Nw== | 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 } |
502993509 | |
https://github.com/simonw/datasette/issues/1439#issuecomment-1045027067 | https://api.github.com/repos/simonw/datasette/issues/1439 | 1045027067 | IC_kwDOBm6k_c4-Sdj7 | 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 } |
973139047 | |
https://github.com/simonw/datasette/issues/1384#issuecomment-869075395 | https://api.github.com/repos/simonw/datasette/issues/1384 | 869075395 | MDEyOklzc3VlQ29tbWVudDg2OTA3NTM5NQ== | 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 } |
930807135 | |
https://github.com/simonw/datasette/issues/1513#issuecomment-970770304 | https://api.github.com/repos/simonw/datasette/issues/1513 | 970770304 | IC_kwDOBm6k_c453MeA | 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 } |
1055469073 | |
https://github.com/simonw/datasette/issues/1344#issuecomment-849788412 | https://api.github.com/repos/simonw/datasette/issues/1344 | 849788412 | MDEyOklzc3VlQ29tbWVudDg0OTc4ODQxMg== | 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 } |
903986178 | |
https://github.com/simonw/sqlite-utils/issues/364#issuecomment-1008151884 | https://api.github.com/repos/simonw/sqlite-utils/issues/364 | 1008151884 | IC_kwDOCGYnMM48Fy1M | 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 } |
1095570074 | |
https://github.com/simonw/sqlite-utils/issues/356#issuecomment-997508728 | https://api.github.com/repos/simonw/sqlite-utils/issues/356 | 997508728 | IC_kwDOCGYnMM47dMZ4 | 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 } |
1077431957 | |
https://github.com/simonw/datasette/issues/153#issuecomment-347735724 | https://api.github.com/repos/simonw/datasette/issues/153 | 347735724 | MDEyOklzc3VlQ29tbWVudDM0NzczNTcyNA== | 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 } |
276842536 | |
https://github.com/simonw/datasette/issues/1249#issuecomment-804406675 | https://api.github.com/repos/simonw/datasette/issues/1249 | 804406675 | MDEyOklzc3VlQ29tbWVudDgwNDQwNjY3NQ== | 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 } |
824064069 | |
https://github.com/simonw/datasette/issues/320#issuecomment-407269243 | https://api.github.com/repos/simonw/datasette/issues/320 | 407269243 | MDEyOklzc3VlQ29tbWVudDQwNzI2OTI0Mw== | 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 } |
334169932 | |
https://github.com/dogsheep/github-to-sqlite/issues/19#issuecomment-602782437 | https://api.github.com/repos/dogsheep/github-to-sqlite/issues/19 | 602782437 | MDEyOklzc3VlQ29tbWVudDYwMjc4MjQzNw== | 9599 | 2020-03-23T18:36:12Z | 2020-03-23T18:51:23Z | MEMBER | * `commits`: `message` * `issue_comments`: `body` * `issues`: `title`, `body` * `labels`: `name`, `description` * `licenses`: `name` * `milestones`: `title`, `description` * `releases`: `name`, `body` * `repos`: `name`, `description` * `users`: `login`, `name` (maybe `company`, `bio`) | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
585850715 | |
https://github.com/simonw/datasette/pull/518#issuecomment-504782618 | https://api.github.com/repos/simonw/datasette/issues/518 | 504782618 | MDEyOklzc3VlQ29tbWVudDUwNDc4MjYxOA== | 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 } |
459587155 | |
https://github.com/simonw/datasette/issues/576#issuecomment-636332183 | https://api.github.com/repos/simonw/datasette/issues/576 | 636332183 | MDEyOklzc3VlQ29tbWVudDYzNjMzMjE4Mw== | 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 } |
497170355 | |
https://github.com/simonw/sqlite-utils/issues/147#issuecomment-683528149 | https://api.github.com/repos/simonw/sqlite-utils/issues/147 | 683528149 | MDEyOklzc3VlQ29tbWVudDY4MzUyODE0OQ== | 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 } |
688670158 | |
https://github.com/simonw/datasette/issues/1711#issuecomment-1095672127 | https://api.github.com/repos/simonw/datasette/issues/1711 | 1095672127 | IC_kwDOBm6k_c5BTqE_ | 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 } |
1200650491 | |
https://github.com/simonw/datasette/issues/1709#issuecomment-1095671940 | https://api.github.com/repos/simonw/datasette/issues/1709 | 1095671940 | IC_kwDOBm6k_c5BTqCE | 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 } |
1200649502 | |
https://github.com/simonw/sqlite-utils/issues/476#issuecomment-1229320114 | https://api.github.com/repos/simonw/sqlite-utils/issues/476 | 1229320114 | IC_kwDOCGYnMM5JRe-y | 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 } |
1353196970 | |
https://github.com/simonw/datasette/issues/2135#issuecomment-1671753753 | https://api.github.com/repos/simonw/datasette/issues/2135 | 1671753753 | IC_kwDOBm6k_c5jpPAZ | 9599 | 2023-08-09T16:26:17Z | 2023-08-09T16:28:19Z | OWNER | - Dropped support for Python 3.7 - New `Justfile` - #1970 - `datasette.render_template()` now accepts a `Context` subclass as an alternative to a dictionary - #2106 - #2007 - https://github.com/simonw/datasette/issues/2130 - https://github.com/simonw/datasette/issues/2079 - https://github.com/simonw/datasette/issues/1153 | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
1843600087 | |
https://github.com/simonw/sqlite-utils/issues/505#issuecomment-1291203911 | https://api.github.com/repos/simonw/sqlite-utils/issues/505 | 1291203911 | IC_kwDOCGYnMM5M9jVH | 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 } |
1423182778 | |
https://github.com/simonw/datasette/issues/1595#issuecomment-1012664607 | https://api.github.com/repos/simonw/datasette/issues/1595 | 1012664607 | IC_kwDOBm6k_c48XAkf | 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 } |
1102484126 | |
https://github.com/simonw/datasette/issues/71#issuecomment-343781030 | https://api.github.com/repos/simonw/datasette/issues/71 | 343781030 | MDEyOklzc3VlQ29tbWVudDM0Mzc4MTAzMA== | 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 } |
273278840 | |
https://github.com/simonw/datasette/issues/1947#issuecomment-1347768549 | https://api.github.com/repos/simonw/datasette/issues/1947 | 1347768549 | IC_kwDOBm6k_c5QVVDl | 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 } |
1493390939 | |
https://github.com/simonw/datasette/issues/71#issuecomment-343780671 | https://api.github.com/repos/simonw/datasette/issues/71 | 343780671 | MDEyOklzc3VlQ29tbWVudDM0Mzc4MDY3MQ== | 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 } |
273278840 | |
https://github.com/dogsheep/twitter-to-sqlite/issues/8#issuecomment-530417631 | https://api.github.com/repos/dogsheep/twitter-to-sqlite/issues/8 | 530417631 | MDEyOklzc3VlQ29tbWVudDUzMDQxNzYzMQ== | 9599 | 2019-09-11T14:52:44Z | 2019-09-14T19:09:22Z | MEMBER | - [x] This needs documentation. | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
490803176 | |
https://github.com/simonw/datasette/issues/1424#issuecomment-894864616 | https://api.github.com/repos/simonw/datasette/issues/1424 | 894864616 | IC_kwDOBm6k_c41Vozo | 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 } |
963527045 | |
https://github.com/simonw/datasette/issues/1518#issuecomment-993794247 | https://api.github.com/repos/simonw/datasette/issues/1518 | 993794247 | IC_kwDOBm6k_c47PBjH | 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 } |
1058072543 | |
https://github.com/simonw/datasette/issues/1439#issuecomment-1045086033 | https://api.github.com/repos/simonw/datasette/issues/1439 | 1045086033 | IC_kwDOBm6k_c4-Sr9R | 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 } |
973139047 | |
https://github.com/simonw/datasette/issues/1821#issuecomment-1258692555 | https://api.github.com/repos/simonw/datasette/issues/1821 | 1258692555 | IC_kwDOBm6k_c5LBh_L | 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 } |
1386734383 | |
https://github.com/simonw/datasette/issues/923#issuecomment-672287754 | https://api.github.com/repos/simonw/datasette/issues/923 | 672287754 | MDEyOklzc3VlQ29tbWVudDY3MjI4Nzc1NA== | 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 } |
677037043 | |
https://github.com/simonw/datasette/issues/40#issuecomment-342030075 | https://api.github.com/repos/simonw/datasette/issues/40 | 342030075 | MDEyOklzc3VlQ29tbWVudDM0MjAzMDA3NQ== | 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 } |
268470572 | |
https://github.com/simonw/datasette/issues/1153#issuecomment-805042880 | https://api.github.com/repos/simonw/datasette/issues/1153 | 805042880 | MDEyOklzc3VlQ29tbWVudDgwNTA0Mjg4MA== | 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 } |
771202454 | |
https://github.com/simonw/datasette/issues/785#issuecomment-636538298 | https://api.github.com/repos/simonw/datasette/issues/785 | 636538298 | MDEyOklzc3VlQ29tbWVudDYzNjUzODI5OA== | 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 } |
628025100 | |
https://github.com/simonw/datasette/issues/1552#issuecomment-996077053 | https://api.github.com/repos/simonw/datasette/issues/1552 | 996077053 | IC_kwDOBm6k_c47Xu39 | 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 } |
1078702875 | |
https://github.com/simonw/datasette/issues/983#issuecomment-766536076 | https://api.github.com/repos/simonw/datasette/issues/983 | 766536076 | MDEyOklzc3VlQ29tbWVudDc2NjUzNjA3Ng== | 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 } |
712260429 | |
https://github.com/simonw/datasette/issues/674#issuecomment-586623462 | https://api.github.com/repos/simonw/datasette/issues/674 | 586623462 | MDEyOklzc3VlQ29tbWVudDU4NjYyMzQ2Mg== | 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 } |
565552217 | |
https://github.com/simonw/datasette/issues/1852#issuecomment-1289774183 | https://api.github.com/repos/simonw/datasette/issues/1852 | 1289774183 | IC_kwDOBm6k_c5M4GRn | 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 } |
1421552095 | |
https://github.com/simonw/datasette/issues/514#issuecomment-504662987 | https://api.github.com/repos/simonw/datasette/issues/514 | 504662987 | MDEyOklzc3VlQ29tbWVudDUwNDY2Mjk4Nw== | 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 } |
459397625 | |
https://github.com/simonw/datasette/issues/808#issuecomment-640157216 | https://api.github.com/repos/simonw/datasette/issues/808 | 640157216 | MDEyOklzc3VlQ29tbWVudDY0MDE1NzIxNg== | 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 } |
632918799 | |
https://github.com/simonw/datasette/pull/1838#issuecomment-1271803298 | https://api.github.com/repos/simonw/datasette/issues/1838 | 1271803298 | IC_kwDOBm6k_c5Lzi2i | 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 } |
1400494162 | |
https://github.com/simonw/datasette/issues/1955#issuecomment-1356610089 | https://api.github.com/repos/simonw/datasette/issues/1955 | 1356610089 | IC_kwDOBm6k_c5Q3Dop | 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 } |
1496652622 | |
https://github.com/simonw/datasette/issues/705#issuecomment-603600553 | https://api.github.com/repos/simonw/datasette/issues/705 | 603600553 | MDEyOklzc3VlQ29tbWVudDYwMzYwMDU1Mw== | 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 } |
585626199 | |
https://github.com/simonw/datasette/issues/1268#issuecomment-803774518 | https://api.github.com/repos/simonw/datasette/issues/1268 | 803774518 | MDEyOklzc3VlQ29tbWVudDgwMzc3NDUxOA== | 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 } |
837308703 | |
https://github.com/simonw/datasette/issues/1518#issuecomment-973700549 | https://api.github.com/repos/simonw/datasette/issues/1518 | 973700549 | IC_kwDOBm6k_c46CX3F | 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 } |
1058072543 | |
https://github.com/simonw/datasette/issues/1955#issuecomment-1356640463 | https://api.github.com/repos/simonw/datasette/issues/1955 | 1356640463 | IC_kwDOBm6k_c5Q3LDP | 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 } |
1496652622 | |
https://github.com/simonw/sqlite-utils/issues/147#issuecomment-779446652 | https://api.github.com/repos/simonw/sqlite-utils/issues/147 | 779446652 | MDEyOklzc3VlQ29tbWVudDc3OTQ0NjY1Mg== | 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 } |
688670158 | |
https://github.com/dogsheep/evernote-to-sqlite/issues/5#issuecomment-706776808 | https://api.github.com/repos/dogsheep/evernote-to-sqlite/issues/5 | 706776808 | MDEyOklzc3VlQ29tbWVudDcwNjc3NjgwOA== | 9599 | 2020-10-11T22:23:14Z | 2020-10-11T22:23:14Z | MEMBER | ... but it's still important to be able to get to the rendered note directly from the browse notes `/evernote/notes` page. Maybe use a simple `render_cell()` hook that just knows how to generate the link to the rendered note page? | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
718938889 | |
https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224283367 | https://api.github.com/repos/simonw/sqlite-utils/issues/467 | 1224283367 | IC_kwDOCGYnMM5I-RTn | 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 } |
1348169997 | |
https://github.com/simonw/datasette/issues/1913#issuecomment-1331204360 | https://api.github.com/repos/simonw/datasette/issues/1913 | 1331204360 | IC_kwDOBm6k_c5PWJEI | 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 } |
1468603401 | |
https://github.com/simonw/datasette/pull/672#issuecomment-586109784 | https://api.github.com/repos/simonw/datasette/issues/672 | 586109784 | MDEyOklzc3VlQ29tbWVudDU4NjEwOTc4NA== | 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 } |
565064079 | |
https://github.com/simonw/datasette/issues/1249#issuecomment-803748469 | https://api.github.com/repos/simonw/datasette/issues/1249 | 803748469 | MDEyOklzc3VlQ29tbWVudDgwMzc0ODQ2OQ== | 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 } |
824064069 | |
https://github.com/simonw/datasette/issues/1565#issuecomment-997472509 | https://api.github.com/repos/simonw/datasette/issues/1565 | 997472509 | IC_kwDOBm6k_c47dDj9 | 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 } |
1083657868 | |
https://github.com/simonw/datasette/issues/971#issuecomment-696302020 | https://api.github.com/repos/simonw/datasette/issues/971 | 696302020 | MDEyOklzc3VlQ29tbWVudDY5NjMwMjAyMA== | 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 } |
705827457 | |
https://github.com/simonw/datasette/issues/1509#issuecomment-1068445412 | https://api.github.com/repos/simonw/datasette/issues/1509 | 1068445412 | IC_kwDOBm6k_c4_ry7k | 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 } |
1054243511 | |
https://github.com/simonw/datasette/issues/1770#issuecomment-1185931417 | https://api.github.com/repos/simonw/datasette/issues/1770 | 1185931417 | IC_kwDOBm6k_c5Gr-CZ | 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 } |
1306492437 | |
https://github.com/simonw/datasette/issues/1072#issuecomment-719810533 | https://api.github.com/repos/simonw/datasette/issues/1072 | 719810533 | MDEyOklzc3VlQ29tbWVudDcxOTgxMDUzMw== | 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 } |
733499930 | |
https://github.com/simonw/datasette/pull/672#issuecomment-586109238 | https://api.github.com/repos/simonw/datasette/issues/672 | 586109238 | MDEyOklzc3VlQ29tbWVudDU4NjEwOTIzOA== | 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 } |
565064079 | |
https://github.com/simonw/sqlite-utils/issues/503#issuecomment-1291111357 | https://api.github.com/repos/simonw/sqlite-utils/issues/503 | 1291111357 | IC_kwDOCGYnMM5M9Mu9 | 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 } |
1423000702 | |
https://github.com/simonw/datasette/issues/1852#issuecomment-1291232589 | https://api.github.com/repos/simonw/datasette/issues/1852 | 1291232589 | IC_kwDOBm6k_c5M9qVN | 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 } |
1421552095 | |
https://github.com/simonw/datasette/issues/1293#issuecomment-813134386 | https://api.github.com/repos/simonw/datasette/issues/1293 | 813134386 | MDEyOklzc3VlQ29tbWVudDgxMzEzNDM4Ng== | 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 } |
849978964 | |
https://github.com/simonw/datasette/issues/268#issuecomment-880153069 | https://api.github.com/repos/simonw/datasette/issues/268 | 880153069 | MDEyOklzc3VlQ29tbWVudDg4MDE1MzA2OQ== | 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 } |
323718842 | |
https://github.com/simonw/datasette/issues/782#issuecomment-782747878 | https://api.github.com/repos/simonw/datasette/issues/782 | 782747878 | MDEyOklzc3VlQ29tbWVudDc4Mjc0Nzg3OA== | 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 } |
627794879 | |
https://github.com/simonw/datasette/issues/1020#issuecomment-712482015 | https://api.github.com/repos/simonw/datasette/issues/1020 | 712482015 | MDEyOklzc3VlQ29tbWVudDcxMjQ4MjAxNQ== | 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 } |
721068929 | |
https://github.com/simonw/datasette/issues/1228#issuecomment-1072907680 | https://api.github.com/repos/simonw/datasette/issues/1228 | 1072907680 | IC_kwDOBm6k_c4_80Wg | 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 } |
810397025 | |
https://github.com/simonw/datasette/issues/1863#issuecomment-1324531750 | https://api.github.com/repos/simonw/datasette/issues/1863 | 1324531750 | IC_kwDOBm6k_c5O8sAm | 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 } |
1425029242 | |
https://github.com/simonw/datasette/issues/216#issuecomment-381799408 | https://api.github.com/repos/simonw/datasette/issues/216 | 381799408 | MDEyOklzc3VlQ29tbWVudDM4MTc5OTQwOA== | 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 } |
314665147 | |
https://github.com/simonw/datasette/issues/2194#issuecomment-1730259871 | https://api.github.com/repos/simonw/datasette/issues/2194 | 1730259871 | IC_kwDOBm6k_c5nIauf | 9599 | 2023-09-21T20:34:09Z | 2023-09-21T20:34:09Z | OWNER | ... which raises the challenge that `datasette publish` doesn't yet know what to do with a config file! https://github.com/simonw/datasette/blob/2da1a6acec915b81a16127008fd739c7d6075681/.github/workflows/deploy-latest.yml#L114-L122 | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
1907695234 | |
https://github.com/simonw/datasette/issues/607#issuecomment-548055544 | https://api.github.com/repos/simonw/datasette/issues/607 | 548055544 | MDEyOklzc3VlQ29tbWVudDU0ODA1NTU0NA== | 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 } |
512996469 | |
https://github.com/simonw/datasette/issues/2189#issuecomment-1730388418 | https://api.github.com/repos/simonw/datasette/issues/2189 | 1730388418 | IC_kwDOBm6k_c5nI6HC | 9599 | 2023-09-21T22:26:19Z | 2023-09-21T22:26:19Z | OWNER | 1.0a7 is out with this fix as well now: https://docs.datasette.io/en/1.0a7/changelog.html#a7-2023-09-21 | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
1901416155 | |
https://github.com/simonw/datasette/issues/859#issuecomment-905900807 | https://api.github.com/repos/simonw/datasette/issues/859 | 905900807 | IC_kwDOBm6k_c41_vMH | 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 } |
642572841 | |
https://github.com/simonw/datasette/pull/2118#issuecomment-1668720671 | https://api.github.com/repos/simonw/datasette/issues/2118 | 1668720671 | IC_kwDOBm6k_c5jdqgf | 9599 | 2023-08-07T23:58:21Z | 2023-08-07T23:58:21Z | OWNER | 11 tests left: ``` FAILED tests/test_html.py::test_alternate_url_json[/fixtures-http://localhost/fixtures.json] - KeyError: 'link' FAILED tests/test_html.py::test_alternate_url_json[/fixtures?sql=select+*+from+facetable-http://localhost/fixtures.json?sql=select+*+from+facetable] - assert '<link rel="alternate" type="application/json+datasette" href="http://localhost/fixtures.json?sql=select+*+from+facetable">' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: select * from... FAILED tests/test_html.py::test_query_page_truncates - assert equals failed FAILED tests/test_html.py::test_templates_considered[/fixtures-database-fixtures.html, *database.html] - assert '<!-- Templates considered: database-fixtures.html, *database.html -->' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures</title>\n <link rel="stylesheet" href="/-/static/app.css?d599...... FAILED tests/test_html.py::test_query_json_csv_export_links - assert '<a href="/fixtures.csv?sql=select+1&_size=max">CSV</a>' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: select 1</title>\n <link rel="stylesheet" href="/-/static/ap...se"}, "view... FAILED tests/test_plugins.py::test_hook_extra_css_urls[/fixtures-expected_decoded_object1] - AssertionError: assert equals failed FAILED tests/test_api.py::test_cors[/fixtures.json?sql=select+blah-400] - KeyError: 'Access-Control-Allow-Origin' FAILED tests/test_plugins.py::test_hook_extra_body_script[/fixtures-expected_extra_body_script1] - AssertionError: assert equals failed FAILED tests/test_table_api.py::test_max_returned_rows - KeyError: 'query' FAILED tests/test_plugins.py::test_view_names[/fixtures-database] - AssertionError: assert equals failed FAILED tests/test_plugins.py::test_view_names[/fixtures?sql=select+1-database] - AssertionError: assert equals failed ======================================================================= 11 failed, 1301 passed, 2 skipped, 1 xfailed in 64.10s (0:01:04) ======================================================================= `… | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
1823352380 | |
https://github.com/simonw/datasette/pull/2118#issuecomment-1668578107 | https://api.github.com/repos/simonw/datasette/issues/2118 | 1668578107 | IC_kwDOBm6k_c5jdHs7 | 9599 | 2023-08-07T21:06:50Z | 2023-08-07T21:06:50Z | OWNER | 15: ``` =========================================================================================== short test summary info ============================================================================================ FAILED tests/test_cli.py::test_sql_errors_logged_to_stderr - assert 0 == 1 FAILED tests/test_html.py::test_show_hide_sql_query - AssertionError: assert False FAILED tests/test_canned_queries.py::test_magic_parameters_cannot_be_used_in_arbitrary_queries - assert 400 == 200 FAILED tests/test_html.py::test_templates_considered[/fixtures-database-fixtures.html, *database.html] - assert '<!-- Templates considered: database-fixtures.html, *database.html -->' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures</title>\n <link rel="stylesheet" href="/-/static/app.css?d599...... FAILED tests/test_html.py::test_query_json_csv_export_links - assert '<a href="/fixtures.csv?sql=select+1&_size=max">CSV</a>' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: select 1</title>\n <link rel="stylesheet" href="/-/static/ap...se"}, "view... FAILED tests/test_html.py::test_base_url_config[True-/fixtures?sql=select+1] - AssertionError: { FAILED tests/test_api.py::test_cors[/fixtures.json?sql=select+blah-400] - assert 200 == 400 FAILED tests/test_html.py::test_alternate_url_json[/fixtures?sql=select+*+from+facetable-http://localhost/fixtures.json?sql=select+*+from+facetable] - assert '<link rel="alternate" type="application/json+datasette" href="http://localhost/fixtures.json?sql=select+*+from+facetable">' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: select * from... FAILED tests/test_plugins.py::test_hook_extra_css_urls[/fixtures-expected_decoded_object1] - AssertionError: assert equals failed FAILED tests/test_plugins.py::test_view_names[/fixtures-database] - AssertionError: assert equals failed FAILED tests/test_plugins.py::test_view_names[/fixtures?sql=select+1-database] - AssertionError: assert equals failed FAILED tests/test_plugins.py::test_hook_extra_body_script[/fixt… | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
1823352380 | |
https://github.com/simonw/datasette/pull/2118#issuecomment-1668568445 | https://api.github.com/repos/simonw/datasette/issues/2118 | 1668568445 | IC_kwDOBm6k_c5jdFV9 | 9599 | 2023-08-07T20:57:46Z | 2023-08-07T20:57:46Z | OWNER | 17 failing tests now. | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
1823352380 | |
https://github.com/simonw/datasette/issues/983#issuecomment-752759885 | https://api.github.com/repos/simonw/datasette/issues/983 | 752759885 | MDEyOklzc3VlQ29tbWVudDc1Mjc1OTg4NQ== | 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 } |
712260429 | |
https://github.com/simonw/datasette/pull/2118#issuecomment-1668781558 | https://api.github.com/repos/simonw/datasette/issues/2118 | 1668781558 | IC_kwDOBm6k_c5jd5X2 | 9599 | 2023-08-08T01:34:42Z | 2023-08-08T01:34:42Z | OWNER | 3 failures left: ``` =================================================================== short test summary info ==================================================================== FAILED tests/test_html.py::test_query_json_csv_export_links - assert '<a href="/fixtures.csv?sql=select+1&_size=max">CSV</a>' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: select 1</title>\n <link r... FAILED tests/test_api.py::test_cors[/fixtures.json?sql=select+blah-400] - KeyError: 'Access-Control-Allow-Origin' FAILED tests/test_table_api.py::test_max_returned_rows - KeyError: 'query' =============================================== 3 failed, 1309 passed, 2 skipped, 1 xfailed in 61.34s (0:01:01) ================================================ ``` | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
1823352380 | |
https://github.com/simonw/sqlite-utils/issues/286#issuecomment-864594956 | https://api.github.com/repos/simonw/sqlite-utils/issues/286 | 864594956 | MDEyOklzc3VlQ29tbWVudDg2NDU5NDk1Ng== | 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 } |
925487946 | |
https://github.com/simonw/datasette/issues/1212#issuecomment-771975941 | https://api.github.com/repos/simonw/datasette/issues/1212 | 771975941 | MDEyOklzc3VlQ29tbWVudDc3MTk3NTk0MQ== | 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 } |
797651831 | |
https://github.com/simonw/datasette/issues/619#issuecomment-852706970 | https://api.github.com/repos/simonw/datasette/issues/619 | 852706970 | MDEyOklzc3VlQ29tbWVudDg1MjcwNjk3MA== | 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 } |
520655983 | |
https://github.com/simonw/datasette/issues/1555#issuecomment-997262475 | https://api.github.com/repos/simonw/datasette/issues/1555 | 997262475 | IC_kwDOBm6k_c47cQSL | 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 } |
1079149656 | |
https://github.com/simonw/datasette/issues/1268#issuecomment-803777724 | https://api.github.com/repos/simonw/datasette/issues/1268 | 803777724 | MDEyOklzc3VlQ29tbWVudDgwMzc3NzcyNA== | 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 } |
837308703 | |
https://github.com/simonw/datasette/issues/705#issuecomment-603599677 | https://api.github.com/repos/simonw/datasette/issues/705 | 603599677 | MDEyOklzc3VlQ29tbWVudDYwMzU5OTY3Nw== | 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 } |
585626199 | |
https://github.com/dogsheep/genome-to-sqlite/issues/1#issuecomment-544648863 | https://api.github.com/repos/dogsheep/genome-to-sqlite/issues/1 | 544648863 | MDEyOklzc3VlQ29tbWVudDU0NDY0ODg2Mw== | 9599 | 2019-10-21T18:36:03Z | 2019-10-21T18:36:03Z | MEMBER | <img width="1418" alt="natalie__select_rsid__genotype__case_genotype_when__AA__then__brown_eye_color__80__of_the_time__when__AG__then__brown_eye_color__when__GG__then__blue_eye_color__99__of_the_time__end_as_interpretation_from_genome_where_rsid____rs12913832__an" src="https://user-images.githubusercontent.com/9599/67232810-f4701000-f3f6-11e9-90e2-8fe2cca1d98d.png"> | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
496415321 | |
https://github.com/simonw/datasette/issues/875#issuecomment-651293559 | https://api.github.com/repos/simonw/datasette/issues/875 | 651293559 | MDEyOklzc3VlQ29tbWVudDY1MTI5MzU1OQ== | 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 } |
647103735 |