issue_comments
10,495 rows sorted by updated_at descending
This data as json, CSV (advanced)
issue >30
- Show column metadata plus links for foreign keys on arbitrary query results 51
- Redesign default .json format 48
- Rethink how .ext formats (v.s. ?_format=) works before 1.0 48
- JavaScript plugin hooks mechanism similar to pluggy 47
- Updated Dockerfile with SpatiaLite version 5.0 45
- Complete refactor of TableView and table.html template 45
- Port Datasette to ASGI 42
- Authentication (and permissions) as a core concept 40
- Deploy a live instance of demos/apache-proxy 34
- await datasette.client.get(path) mechanism for executing internal requests 33
- Maintain an in-memory SQLite table of connected databases and their tables 32
- Research: demonstrate if parallel SQL queries are worthwhile 32
- Ability to sort (and paginate) by column 31
- Default API token authentication mechanism 30
- link_or_copy_directory() error - Invalid cross-device link 28
- Export to CSV 27
- base_url configuration setting 27
- Documentation with recommendations on running Datasette in production without using Docker 27
- Optimize all those calls to index_list and foreign_key_list 27
- Support cross-database joins 26
- Ability for a canned query to write to the database 26
- table.transform() method for advanced alter table 26
- New pattern for views that return either JSON or HTML, available for plugins 26
- Proof of concept for Datasette on AWS Lambda with EFS 25
- WIP: Add Gmail takeout mbox import 25
- Redesign register_output_renderer callback 24
- Make it easier to insert geometries, with documentation and maybe code 24
- Stream all results for arbitrary SQL and canned queries 23
- "datasette insert" command and plugin hook 23
- Datasette Plugins 22
- …
created_at (date) >30 ✖
- 2021-03-22 66
- 2021-11-19 60
- 2020-10-15 52
- 2020-09-22 51
- 2020-10-30 49
- 2022-10-26 47
- 2022-03-21 46
- 2020-12-18 43
- 2020-06-09 42
- 2020-06-18 41
- 2022-10-25 41
- 2022-01-09 40
- 2022-06-14 40
- 2020-05-27 39
- 2020-10-20 39
- 2021-11-16 39
- 2021-12-16 39
- 2020-12-30 38
- 2022-10-27 38
- 2020-10-09 36
- 2021-11-20 36
- 2022-01-20 36
- 2022-03-19 36
- 2020-09-15 34
- 2021-11-29 34
- 2020-06-08 33
- 2021-01-04 33
- 2021-05-27 33
- 2022-02-06 33
- 2020-06-01 32
- …
id | html_url | issue_url | node_id | user | created_at | updated_at ▲ | author_association | body | reactions | issue | performed_via_github_app |
---|---|---|---|---|---|---|---|---|---|---|---|
1294116493 | https://github.com/simonw/datasette/issues/1786#issuecomment-1294116493 | https://api.github.com/repos/simonw/datasette/issues/1786 | IC_kwDOBm6k_c5NIqaN | simonw 9599 | 2022-10-27T21:50:12Z | 2022-10-27T21:50:12Z | OWNER | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Adjust height of textarea for no JS case 1342430983 | ||
1294105558 | https://github.com/simonw/datasette/issues/1869#issuecomment-1294105558 | https://api.github.com/repos/simonw/datasette/issues/1869 | IC_kwDOBm6k_c5NInvW | simonw 9599 | 2022-10-27T21:44:13Z | 2022-10-27T21:44:13Z | OWNER | I'm going to do annotated release notes for this one. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Release 0.63 1426253476 | |
1294056552 | https://github.com/simonw/datasette/issues/1869#issuecomment-1294056552 | https://api.github.com/repos/simonw/datasette/issues/1869 | IC_kwDOBm6k_c5NIbxo | simonw 9599 | 2022-10-27T21:00:02Z | 2022-10-27T21:02:25Z | OWNER | Those release notes as markdown: Features
Plugin hooks and internals
Documentation
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Release 0.63 1426253476 | |
1294049178 | https://github.com/simonw/datasette/pull/1835#issuecomment-1294049178 | https://api.github.com/repos/simonw/datasette/issues/1835 | IC_kwDOBm6k_c5NIZ-a | simonw 9599 | 2022-10-27T20:51:30Z | 2022-10-27T20:51:30Z | OWNER | See also: - https://github.com/simonw/datasette/pull/1837 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
use inspect data for hash and file size 1400121355 | |
1294048849 | https://github.com/simonw/datasette/pull/1837#issuecomment-1294048849 | https://api.github.com/repos/simonw/datasette/issues/1837 | IC_kwDOBm6k_c5NIZ5R | simonw 9599 | 2022-10-27T20:51:08Z | 2022-10-27T20:51:08Z | OWNER | Yeah this is better, thanks! |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Make hash and size a lazy property 1400431789 | |
1294034011 | https://github.com/simonw/datasette/pull/1839#issuecomment-1294034011 | https://api.github.com/repos/simonw/datasette/issues/1839 | IC_kwDOBm6k_c5NIWRb | simonw 9599 | 2022-10-27T20:34:37Z | 2022-10-27T20:34:37Z | OWNER | @dependabot rebase |
{ "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Bump black from 22.8.0 to 22.10.0 1401155623 | |
1294012583 | https://github.com/simonw/datasette/issues/1851#issuecomment-1294012583 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NIRCn | simonw 9599 | 2022-10-27T20:11:22Z | 2022-10-27T20:11:22Z | OWNER | And the response to |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1294012084 | https://github.com/simonw/datasette/issues/1851#issuecomment-1294012084 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NIQ60 | simonw 9599 | 2022-10-27T20:10:47Z | 2022-10-27T20:10:47Z | OWNER | I'm going to change the incoming JSON back to |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1294009354 | https://github.com/simonw/datasette/issues/1851#issuecomment-1294009354 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NIQQK | simonw 9599 | 2022-10-27T20:07:42Z | 2022-10-27T20:07:42Z | OWNER | Need to implement the new URL design from: - #1868 This is now going to be |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1294008733 | https://github.com/simonw/datasette/issues/1868#issuecomment-1294008733 | https://api.github.com/repos/simonw/datasette/issues/1868 | IC_kwDOBm6k_c5NIQGd | simonw 9599 | 2022-10-27T20:07:01Z | 2022-10-27T20:07:01Z | OWNER | I'm happy with this |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Design URLs for the write API 1426195437 | |
1294008282 | https://github.com/simonw/datasette/issues/1868#issuecomment-1294008282 | https://api.github.com/repos/simonw/datasette/issues/1868 | IC_kwDOBm6k_c5NIP_a | simonw 9599 | 2022-10-27T20:06:34Z | 2022-10-27T20:06:34Z | OWNER | I'm going to stick with one |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Design URLs for the write API 1426195437 | |
1294007024 | https://github.com/simonw/datasette/issues/1868#issuecomment-1294007024 | https://api.github.com/repos/simonw/datasette/issues/1868 | IC_kwDOBm6k_c5NIPrw | simonw 9599 | 2022-10-27T20:05:44Z | 2022-10-27T20:05:52Z | OWNER | So given this scheme, the URL design would look like this:
And for rows (
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Design URLs for the write API 1426195437 | |
1294004308 | https://github.com/simonw/datasette/issues/1868#issuecomment-1294004308 | https://api.github.com/repos/simonw/datasette/issues/1868 | IC_kwDOBm6k_c5NIPBU | simonw 9599 | 2022-10-27T20:03:08Z | 2022-10-27T20:03:08Z | OWNER | The other option here would be to lean into custom HTTP verbs like |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Design URLs for the write API 1426195437 | |
1294003701 | https://github.com/simonw/datasette/issues/1868#issuecomment-1294003701 | https://api.github.com/repos/simonw/datasette/issues/1868 | IC_kwDOBm6k_c5NIO31 | simonw 9599 | 2022-10-27T20:02:26Z | 2022-10-27T20:02:26Z | OWNER | The problem with the above design is that I want to support a bunch of different actions that can be taken against a table: - insert a single row - insert multiple rows - bulk update rows - rename table - alter table - drop table I could have ALL of those be a
This is already slightly confusing in that So I'm ready to consider other design options. Initial thoughts on possible designs (for the single row insert case, but could be expanded to cover other verbs):
I quite like that third one: it feels consistent with the existing There's one slight confusion here in that it overlaps with the URL for a row with a primary key of Especially if I say that child pages of rows must theselves use the
So a row with primary key |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Design URLs for the write API 1426195437 | |
1293996735 | https://github.com/simonw/datasette/issues/1851#issuecomment-1293996735 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NINK_ | simonw 9599 | 2022-10-27T19:54:53Z | 2022-10-27T19:54:53Z | OWNER | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | ||
1292997608 | https://github.com/simonw/datasette/issues/1851#issuecomment-1292997608 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NEZPo | simonw 9599 | 2022-10-27T04:54:53Z | 2022-10-27T19:05:50Z | OWNER | I'm going to change the design of this to:
This will be consistent with adding The API response will look like this:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1293939737 | https://github.com/simonw/datasette/issues/1860#issuecomment-1293939737 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NH_QZ | simonw 9599 | 2022-10-27T18:57:37Z | 2022-10-27T18:57:37Z | OWNER | The new code is now live at https://latest.datasette.io/fixtures |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1293928738 | https://github.com/simonw/datasette/issues/1860#issuecomment-1293928738 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NH8ki | simonw 9599 | 2022-10-27T18:46:31Z | 2022-10-27T18:46:31Z | OWNER | I think mine has a better pattern for handling |
{ "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1293928230 | https://github.com/simonw/datasette/issues/1860#issuecomment-1293928230 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NH8cm | simonw 9599 | 2022-10-27T18:46:03Z | 2022-10-27T18:46:03Z | OWNER | Here's yours on Debuggex: https://www.debuggex.com/r/HjdJryTy9ezGsuWK |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1293926417 | https://github.com/simonw/datasette/issues/1860#issuecomment-1293926417 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NH8AR | simonw 9599 | 2022-10-27T18:44:20Z | 2022-10-27T18:45:21Z | OWNER | Hah, I just came up with this one - we were clearly working on this at the same time!
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1293912781 | https://github.com/simonw/datasette/issues/1860#issuecomment-1293912781 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NH4rN | CharlesNepote 562352 | 2022-10-27T18:31:15Z | 2022-10-27T18:31:15Z | NONE | Here is my suggestion:
See the following test: https://regex101.com/r/Doeqqa/1 And here I played all your tests: https://regexr.com/713ir |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1293893789 | https://github.com/simonw/datasette/issues/1866#issuecomment-1293893789 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NH0Cd | simonw 9599 | 2022-10-27T18:13:00Z | 2022-10-27T18:13:00Z | OWNER | If people care about that kind of thing they could always push all of their inserts to a table called |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API for bulk inserting records into a table 1426001541 | |
1293892818 | https://github.com/simonw/datasette/issues/1866#issuecomment-1293892818 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NHzzS | simonw 9599 | 2022-10-27T18:12:02Z | 2022-10-27T18:12:02Z | OWNER | There's one catch with batched inserts: if your CLI tool fails half way through you could end up with a partially populated table - since a bunch of batches will have succeeded first. I think that's OK. In the future I may want to come up with a way to run multiple batches of inserts inside a single transaction, but I can ignore that for the first release of this feature. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API for bulk inserting records into a table 1426001541 | |
1293891876 | https://github.com/simonw/datasette/issues/1866#issuecomment-1293891876 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NHzkk | simonw 9599 | 2022-10-27T18:11:05Z | 2022-10-27T18:11:05Z | OWNER | Likewise for newline-delimited JSON. While it's tempting to want to accept that as an ingest format (because it's nice to generate and stream) I think it's better to have a client application that can turn a stream of newline-delimited JSON into batched JSON inserts. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API for bulk inserting records into a table 1426001541 | |
1293891191 | https://github.com/simonw/datasette/issues/1866#issuecomment-1293891191 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NHzZ3 | simonw 9599 | 2022-10-27T18:10:22Z | 2022-10-27T18:10:22Z | OWNER | So for the moment I'm just going to concentrate on the JSON API. I can consider CSV variants later on, or as plugins, or both. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API for bulk inserting records into a table 1426001541 | |
1293890684 | https://github.com/simonw/datasette/issues/1866#issuecomment-1293890684 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NHzR8 | simonw 9599 | 2022-10-27T18:09:52Z | 2022-10-27T18:09:52Z | OWNER | Should this API accept CSV/TSV etc in addition to JSON? I'm torn on this one. My initial instinct is that it should not - and there should instead be a Datasette client library / CLI tool you can use that knows how to turn CSV into batches of JSON calls for when you want to upload a CSV file. I don't think the usability of |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API for bulk inserting records into a table 1426001541 | |
1293887808 | https://github.com/simonw/datasette/issues/1866#issuecomment-1293887808 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NHylA | simonw 9599 | 2022-10-27T18:07:02Z | 2022-10-27T18:07:02Z | OWNER | Error handling is really important here. What should happen if you submit 100 records and one of them has some kind of validation error? How should that error be reported back to you? I'm inclined to say that it defaults to all-or-nothing in a transaction - but there should be a |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API for bulk inserting records into a table 1426001541 | |
1293863145 | https://github.com/simonw/datasette/issues/1860#issuecomment-1293863145 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NHsjp | CharlesNepote 562352 | 2022-10-27T17:43:37Z | 2022-10-27T17:43:37Z | NONE | Sorry I forgot the I'm afraid there is an issue in your regexp, see: https://regex101.com/r/pyubJf/1 I guess I can fix it. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1293857306 | https://github.com/simonw/datasette/issues/1862#issuecomment-1293857306 | https://api.github.com/repos/simonw/datasette/issues/1862 | IC_kwDOBm6k_c5NHrIa | simonw 9599 | 2022-10-27T17:38:17Z | 2022-10-27T17:38:17Z | OWNER | Strongly related to: - #1866 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Create a new table from one or more records, `sqlite-utils` style 1425011030 | |
1293568194 | https://github.com/simonw/datasette/issues/1865#issuecomment-1293568194 | https://api.github.com/repos/simonw/datasette/issues/1865 | IC_kwDOBm6k_c5NGkjC | simonw 9599 | 2022-10-27T13:58:26Z | 2022-10-27T13:58:26Z | OWNER | Here's the issue where I started doing this: - #849 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stop syncing main to master 1425682079 | |
649908756 | https://github.com/simonw/datasette/issues/849#issuecomment-649908756 | https://api.github.com/repos/simonw/datasette/issues/849 | MDEyOklzc3VlQ29tbWVudDY0OTkwODc1Ng== | simonw 9599 | 2020-06-26T02:09:09Z | 2022-10-27T13:57:08Z | OWNER | I mentioned this issue here: https://simonwillison.net/2020/Jun/26/weeknotes-plugins-sqlite-generate/ Repositories created by following the README in https://github.com/simonw/datasette-template and https://github.com/simonw/click-app have a |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Rename master branch to main 639072811 | |
1292999579 | https://github.com/simonw/datasette/issues/1851#issuecomment-1292999579 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NEZub | simonw 9599 | 2022-10-27T04:59:06Z | 2022-10-27T04:59:12Z | OWNER | I should probably refactor this to use Might make it easier to solve the rowid issues too. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1292996181 | https://github.com/simonw/datasette/issues/1851#issuecomment-1292996181 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NEY5V | simonw 9599 | 2022-10-27T04:51:47Z | 2022-10-27T04:51:47Z | OWNER | Also need a test for invalid JSON (currently triggers a 500 HTML error). |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1292962813 | https://github.com/simonw/datasette/issues/1855#issuecomment-1292962813 | https://api.github.com/repos/simonw/datasette/issues/1855 | IC_kwDOBm6k_c5NEQv9 | simonw 9599 | 2022-10-27T04:31:40Z | 2022-10-27T04:31:40Z | OWNER | My hunch on this is that anyone with that level of complex permissions requirements needs to be using a custom authentication plugin which includes much more concrete token rules, rather than the default signed stateless token implementation that ships with Datasette core. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`datasette create-token` ability to create tokens with a reduced set of permissions 1423336089 | |
1292959886 | https://github.com/simonw/datasette/issues/1855#issuecomment-1292959886 | https://api.github.com/repos/simonw/datasette/issues/1855 | IC_kwDOBm6k_c5NEQCO | simonw 9599 | 2022-10-27T04:30:07Z | 2022-10-27T04:30:07Z | OWNER | Here's an interesting edge-case to consider: what if a user creates themselves a token for a specific table, then deletes that table, and waits for another user to create a table of the same name... and then uses their previously created token to write to the table that someone else created? Not sure if this is a threat I need to actively consider, but it's worth thinking a little bit about the implications of such a thing - since there will be APIs that allow users to create tables, and there may be cases where people want to have a concept of users "owning" specific tables. This is probably something that could be left for plugins to solve, but it still needs to be understood and potentially documented. There may even be a world in which tracking the timestamp at which a table was created becomes useful - because that could then be baked into API tokens, such that a token created BEFORE the table was created does not grant access to that table. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`datasette create-token` ability to create tokens with a reduced set of permissions 1423336089 | |
1292952121 | https://github.com/simonw/datasette/issues/1851#issuecomment-1292952121 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NEOI5 | simonw 9599 | 2022-10-27T04:24:09Z | 2022-10-27T04:24:20Z | OWNER | And come up with a whole bunch of tests for weird table shapes, surprising column names, different types etc. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1292951833 | https://github.com/simonw/datasette/issues/1851#issuecomment-1292951833 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NEOEZ | simonw 9599 | 2022-10-27T04:23:40Z | 2022-10-27T04:23:40Z | OWNER | Also need to think about transactions - it should use them! |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1292939146 | https://github.com/simonw/datasette/issues/1851#issuecomment-1292939146 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NEK-K | simonw 9599 | 2022-10-27T04:00:17Z | 2022-10-27T04:23:15Z | OWNER | Documentation for this first draft of the API: https://docs.datasette.io/en/1.0-dev/json_api.html#inserting-a-single-row It currently returns errors as HTML - it needs to return errors as JSON. Also the errors need comprehensive test coverage. I'm also worried about what happens if you use it on a table that doesn't use an integer primary key - need to check that. I think this code may break: Plus will |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1292940011 | https://github.com/simonw/datasette/issues/1850#issuecomment-1292940011 | https://api.github.com/repos/simonw/datasette/issues/1850 | IC_kwDOBm6k_c5NELLr | simonw 9599 | 2022-10-27T04:01:59Z | 2022-10-27T04:01:59Z | OWNER | Working on that first "insert row" implementation: Has made it very clear to me that I should go the whole hog and build the basic form-based interface for this as well. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Write API in Datasette core 1421529723 | |
1292709818 | https://github.com/simonw/datasette/issues/1858#issuecomment-1292709818 | https://api.github.com/repos/simonw/datasette/issues/1858 | IC_kwDOBm6k_c5NDS-6 | simonw 9599 | 2022-10-26T22:07:04Z | 2022-10-26T22:07:04Z | OWNER | New token design:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`max_signed_tokens_ttl` setting for a maximum duration on API tokens 1423364990 | |
1292708227 | https://github.com/simonw/datasette/issues/1858#issuecomment-1292708227 | https://api.github.com/repos/simonw/datasette/issues/1858 | IC_kwDOBm6k_c5NDSmD | simonw 9599 | 2022-10-26T22:05:34Z | 2022-10-26T22:05:34Z | OWNER | I just realized this can't easily affect the More to the point: even if it did, someone could abuse their knowledge of the secret to create a signed non-expiring token even on servers that didn't want to support those. So I actually need to redesign the token format: it needs to store the timestamp when the token was created and the intended duration, NOT the timestamp that the token expires at. Otherwise it's not possible for servers to enforce |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`max_signed_tokens_ttl` setting for a maximum duration on API tokens 1423364990 | |
1292687774 | https://github.com/simonw/datasette/issues/1858#issuecomment-1292687774 | https://api.github.com/repos/simonw/datasette/issues/1858 | IC_kwDOBm6k_c5NDNme | simonw 9599 | 2022-10-26T21:44:57Z | 2022-10-26T21:44:57Z | OWNER | I'm going for consistency with So |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`max_signed_tokens_ttl` setting for a maximum duration on API tokens 1423364990 | |
1292685478 | https://github.com/simonw/datasette/issues/1860#issuecomment-1292685478 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NDNCm | simonw 9599 | 2022-10-26T21:42:35Z | 2022-10-26T21:42:35Z | OWNER | That's deployed to https://latest.datasette.io/ now - some examples:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1292679567 | https://github.com/simonw/datasette/issues/1860#issuecomment-1292679567 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NDLmP | simonw 9599 | 2022-10-26T21:36:25Z | 2022-10-26T21:36:25Z | OWNER | I'm never 100% sure how to tell if a regular expression includes a nasty denial of service attack - are there any inputs that could cause this new regex to execute in quadratic time or similar? |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1292678657 | https://github.com/simonw/datasette/issues/1860#issuecomment-1292678657 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NDLYB | simonw 9599 | 2022-10-26T21:35:23Z | 2022-10-26T21:35:37Z | OWNER | Here are the new tests - each of these should now work: https://github.com/simonw/datasette/blob/55a709c480a1e7401b4ff6208f37a2cf7c682183/tests/test_utils.py#L170-L175 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1292674919 | https://github.com/simonw/datasette/issues/1860#issuecomment-1292674919 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NDKdn | simonw 9599 | 2022-10-26T21:31:22Z | 2022-10-26T21:31:22Z | OWNER | I'm experimenting with this: ```python Allow SQL to start with a / / or -- commentcomment_re = ( # Start of string, then any amount of whitespace r'^(\s' + # Comment that starts with -- and ends at a newline r'(?:--.?\n\s)' + # Comment that starts with / and ends with / r'|(?:/*[\s\S]?*/)' + # Whitespace r')\s' ) allowed_sql_res = [ re.compile(comment_re + r"select\b"), re.compile(comment_re + r"explain\s+select\b"), re.compile(comment_re + r"explain\s+query\s+plan\s+select\b"), re.compile(comment_re + r"with\b"), re.compile(comment_re + r"explain\s+with\b"), re.compile(comment_re + r"explain\s+query\s+plan\s+with\b"), ] ``` This should allow any number of comments of either type as a suffix to the allowed SQL patterns. Needs extensive unit tests! I'm not massively worried if it has a flaw in it though, since this is part of Datasette's defense in depth: if a non-SELECT query sneaks through it still shouldn't be able to cause any damage as the database connection is read-only or immutable. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1292659986 | https://github.com/simonw/datasette/issues/1860#issuecomment-1292659986 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NDG0S | simonw 9599 | 2022-10-26T21:14:26Z | 2022-10-26T21:15:22Z | OWNER | Yeah we should fix this. https://www.sqlite.org/lang_comment.html - SQLite also supports I like how explicit the documentation is here:
|
{ "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1292654852 | https://github.com/simonw/datasette/issues/1849#issuecomment-1292654852 | https://api.github.com/repos/simonw/datasette/issues/1849 | IC_kwDOBm6k_c5NDFkE | simonw 9599 | 2022-10-26T21:08:44Z | 2022-10-26T21:08:44Z | OWNER | Generally though we should expect that people might try to use |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
NoneType' object has no attribute 'actor' 1420174670 | |
1292654522 | https://github.com/simonw/datasette/issues/1849#issuecomment-1292654522 | https://api.github.com/repos/simonw/datasette/issues/1849 | IC_kwDOBm6k_c5NDFe6 | simonw 9599 | 2022-10-26T21:08:20Z | 2022-10-26T21:08:20Z | OWNER | From the stack trace in Sentry: So this happened because a custom plugin tried to render |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
NoneType' object has no attribute 'actor' 1420174670 | |
1292653219 | https://github.com/simonw/datasette/issues/1849#issuecomment-1292653219 | https://api.github.com/repos/simonw/datasette/issues/1849 | IC_kwDOBm6k_c5NDFKj | simonw 9599 | 2022-10-26T21:06:56Z | 2022-10-26T21:06:56Z | OWNER | This was a hit to an authenticated page where the incoming user WAS logged in but did not have permission to view that specific page. Code in question: https://github.com/simonw/datasette/blob/c7dd76c26257ded5bcdfd0570e12412531b8b88f/datasette/app.py#L634-L640 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
NoneType' object has no attribute 'actor' 1420174670 | |
1292592210 | https://github.com/simonw/datasette/issues/1851#issuecomment-1292592210 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NC2RS | eyeseast 25778 | 2022-10-26T20:03:46Z | 2022-10-26T20:03:46Z | CONTRIBUTOR | Yeah, every time I see something cool done with triggers, I remember that I need to start using triggers. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1292544296 | https://github.com/simonw/datasette/issues/1851#issuecomment-1292544296 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NCqko | simonw 9599 | 2022-10-26T19:33:34Z | 2022-10-26T19:33:34Z | OWNER | That trigger solution is pretty neat! |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1292519956 | https://github.com/simonw/datasette/issues/1851#issuecomment-1292519956 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NCkoU | asg017 15178711 | 2022-10-26T19:20:33Z | 2022-10-26T19:20:33Z | CONTRIBUTOR |
@eyeseast Maybe you could do this with triggers? Like you can insert JSON-friendly data into a "raw" table, and create a trigger that transforms that inserted data into the proper table Here's an example: ```sql -- meant to be updated from a Datasette insert create table points_raw(longitude int, latitude int); -- the target table with proper spatliate geometries create table points(point geometry); CREATE TRIGGER insert_points_raw INSERT ON points_raw BEGIN insert into points(point) values (makepoint(new.longitude, new.latitude)) END; ``` You could then POST a new row to Then SQLite with run the trigger and insert a new row in |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1292401308 | https://github.com/simonw/sqlite-utils/pull/499#issuecomment-1292401308 | https://api.github.com/repos/simonw/sqlite-utils/issues/499 | IC_kwDOCGYnMM5NCHqc | chapmanjacobd 7908073 | 2022-10-26T17:54:26Z | 2022-10-26T17:54:51Z | CONTRIBUTOR | The problem with how it is currently is that the transformed fts table will return incorrect results (unless the table was only 1 row or something), even if create_triggers was enabled previously. Maybe the simplest solution is to disable fts on a transformed table rather than try to recreate it? Thoughts? |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
feat: recreate fts triggers after table transform 1405196044 | |
1292390996 | https://github.com/simonw/datasette/issues/1860#issuecomment-1292390996 | https://api.github.com/repos/simonw/datasette/issues/1860 | IC_kwDOBm6k_c5NCFJU | CharlesNepote 562352 | 2022-10-26T17:43:41Z | 2022-10-26T17:43:41Z | NONE | I guess the issue is here: https://github.com/simonw/datasette/blob/9676b2deb07cff20247ba91dad3e84a4ab0b00d1/datasette/utils/init.py#L209 Here is a working regexp allowing it:
You can play with the regexp here: https://regex101.com/r/aESXDL/3 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SQL query field can't begin by a comment 1424378012 | |
1291485444 | https://github.com/simonw/datasette/issues/1855#issuecomment-1291485444 | https://api.github.com/repos/simonw/datasette/issues/1855 | IC_kwDOBm6k_c5M-oEE | simonw 9599 | 2022-10-26T04:30:34Z | 2022-10-26T04:30:34Z | OWNER | I'm going to delay working on this until after I have some of the write APIs built to try it against: - #1851 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`datasette create-token` ability to create tokens with a reduced set of permissions 1423336089 | |
1291484749 | https://github.com/simonw/datasette/issues/1859#issuecomment-1291484749 | https://api.github.com/repos/simonw/datasette/issues/1859 | IC_kwDOBm6k_c5M-n5N | simonw 9599 | 2022-10-26T04:29:43Z | 2022-10-26T04:29:43Z | OWNER | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
datasette create-token CLI command 1423369494 | ||
1291467084 | https://github.com/simonw/datasette/issues/1843#issuecomment-1291467084 | https://api.github.com/repos/simonw/datasette/issues/1843 | IC_kwDOBm6k_c5M-jlM | simonw 9599 | 2022-10-26T04:03:49Z | 2022-10-26T04:03:49Z | OWNER | This time I'm suspicious that there are open SQLite files tucked away in thread locals hidden inside my thread pool executor: |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Intermittent "Too many open files" error running tests 1408757705 | |
1291466613 | https://github.com/simonw/datasette/issues/1843#issuecomment-1291466613 | https://api.github.com/repos/simonw/datasette/issues/1843 | IC_kwDOBm6k_c5M-jd1 | simonw 9599 | 2022-10-26T04:02:56Z | 2022-10-26T04:02:56Z | OWNER | Just saw this error again! |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Intermittent "Too many open files" error running tests 1408757705 | |
1291439998 | https://github.com/simonw/datasette/issues/1859#issuecomment-1291439998 | https://api.github.com/repos/simonw/datasette/issues/1859 | IC_kwDOBm6k_c5M-c9- | simonw 9599 | 2022-10-26T03:15:13Z | 2022-10-26T03:15:13Z | OWNER | Reads from |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
datasette create-token CLI command 1423369494 | |
1291439875 | https://github.com/simonw/datasette/issues/1859#issuecomment-1291439875 | https://api.github.com/repos/simonw/datasette/issues/1859 | IC_kwDOBm6k_c5M-c8D | simonw 9599 | 2022-10-26T03:14:58Z | 2022-10-26T03:14:58Z | OWNER | Initial design:
Or:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
datasette create-token CLI command 1423369494 | |
1291435464 | https://github.com/simonw/datasette/issues/1858#issuecomment-1291435464 | https://api.github.com/repos/simonw/datasette/issues/1858 | IC_kwDOBm6k_c5M-b3I | simonw 9599 | 2022-10-26T03:07:16Z | 2022-10-26T03:07:16Z | OWNER | This setting will disable the "Token never expires" option: |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`max_signed_tokens_ttl` setting for a maximum duration on API tokens 1423364990 | |
1291406219 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291406219 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M-UuL | simonw 9599 | 2022-10-26T02:19:54Z | 2022-10-26T02:59:52Z | OWNER | I'm going to split the remaining work into separate issues:
|
{ "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 | |
1291431132 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291431132 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M-azc | simonw 9599 | 2022-10-26T02:59:50Z | 2022-10-26T02:59:50Z | OWNER | { "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 | ||
1291430992 | https://github.com/simonw/datasette/issues/1850#issuecomment-1291430992 | https://api.github.com/repos/simonw/datasette/issues/1850 | IC_kwDOBm6k_c5M-axQ | simonw 9599 | 2022-10-26T02:59:33Z | 2022-10-26T02:59:33Z | OWNER | I started the documentation for the API tokens mechanism here: https://docs.datasette.io/en/1.0-dev/authentication.html#api-tokens |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Write API in Datasette core 1421529723 | |
1291418546 | https://github.com/simonw/datasette/issues/1857#issuecomment-1291418546 | https://api.github.com/repos/simonw/datasette/issues/1857 | IC_kwDOBm6k_c5M-Xuy | simonw 9599 | 2022-10-26T02:38:35Z | 2022-10-26T02:38:35Z | OWNER | I'm going to set a convention that an actor signed in via a token should set |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Prevent API tokens from using /-/create-token to create more tokens 1423347412 | |
1291417755 | https://github.com/simonw/datasette/issues/1850#issuecomment-1291417755 | https://api.github.com/repos/simonw/datasette/issues/1850 | IC_kwDOBm6k_c5M-Xib | simonw 9599 | 2022-10-26T02:36:52Z | 2022-10-26T02:36:58Z | OWNER | I'm going to set a convention that
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Write API in Datasette core 1421529723 | |
1291417100 | https://github.com/simonw/datasette/issues/1850#issuecomment-1291417100 | https://api.github.com/repos/simonw/datasette/issues/1850 | IC_kwDOBm6k_c5M-XYM | simonw 9599 | 2022-10-26T02:35:32Z | 2022-10-26T02:35:32Z | OWNER | It strikes me that users should NOT be able to use a token to create additional tokens. The current design actually does allow that, since the So I think I need a mechanism whereby that page can only allow access to users authenticated by cookie. Not obvious how to do that though, since Datasette's authentication actor system is designed to abstract that detail away! |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Write API in Datasette core 1421529723 | |
1291410747 | https://github.com/simonw/datasette/issues/1856#issuecomment-1291410747 | https://api.github.com/repos/simonw/datasette/issues/1856 | IC_kwDOBm6k_c5M-V07 | simonw 9599 | 2022-10-26T02:27:05Z | 2022-10-26T02:27:05Z | OWNER | Because of that I think this is a better name:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
allow_signed_tokens setting for disabling API signed token mechanism 1423336122 | |
1291410331 | https://github.com/simonw/datasette/issues/1856#issuecomment-1291410331 | https://api.github.com/repos/simonw/datasette/issues/1856 | IC_kwDOBm6k_c5M-Vub | simonw 9599 | 2022-10-26T02:26:19Z | 2022-10-26T02:26:19Z | OWNER | It's a bit confusing that a setting called Is it confusing enough that I should pick a different name for the setting though? |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
allow_signed_tokens setting for disabling API signed token mechanism 1423336122 | |
1291409312 | https://github.com/simonw/datasette/issues/1856#issuecomment-1291409312 | https://api.github.com/repos/simonw/datasette/issues/1856 | IC_kwDOBm6k_c5M-Veg | simonw 9599 | 2022-10-26T02:24:49Z | 2022-10-26T02:24:49Z | OWNER | The effect of this setting will be:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
allow_signed_tokens setting for disabling API signed token mechanism 1423336122 | |
1291397623 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291397623 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M-Sn3 | simonw 9599 | 2022-10-26T02:11:40Z | 2022-10-26T02:11:40Z | OWNER | Built a prototype of the
|
{ "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 | |
1291392887 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291392887 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M-Rd3 | simonw 9599 | 2022-10-26T02:04:48Z | 2022-10-26T02:04:48Z | OWNER | Implemented that |
{ "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 | |
1291290451 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291290451 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M94dT | simonw 9599 | 2022-10-26T00:49:56Z | 2022-10-26T00:49:56Z | OWNER | Prefix: |
{ "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 | |
1291289369 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291289369 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M94MZ | simonw 9599 | 2022-10-26T00:47:46Z | 2022-10-26T00:47:46Z | OWNER | The tokens also need something that can be used to differentiate them from alternative token mechanisms that other plugins might provide. Maybe a prefix before the signed value. Prefixes are also useful for scanning to check they were not accidentally committed to source control. |
{ "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 | |
1291272280 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291272280 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M90BY | simonw 9599 | 2022-10-26T00:16:09Z | 2022-10-26T00:46:21Z | OWNER | Other options:
These feel inconsistent because they don't use the I like that last one. |
{ "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 | |
1291281243 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291281243 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M92Nb | simonw 9599 | 2022-10-26T00:32:21Z | 2022-10-26T00:32:21Z | OWNER | Rather than duplicating the entire actor into the "a" field, maybe just copy the actor ID? Would need to restrict token creation to just actors with an ID set. |
{ "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 | |
1291277913 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291277913 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M91ZZ | ocdtrekkie 4399499 | 2022-10-26T00:26:11Z | 2022-10-26T00:26:11Z | NONE |
This is what we do for Sandstorm essentially and I fully agree it's the right way to do API tokens in multiuser systems. Constraints will definitely be important though. I know I want a token to submit error reports programmatically, but I wouldn't want that token to convey my right to delete tables and records, Little Bobby Tables is out there somewhere, and he's all grown up now. |
{ "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 | |
1291274835 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291274835 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M90pT | simonw 9599 | 2022-10-26T00:20:48Z | 2022-10-26T00:22:26Z | OWNER | Tests failed because I added a view without also adding documentation! I forgot that the deploy still goes out for branches other than |
{ "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 | |
1291273609 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291273609 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M90WJ | simonw 9599 | 2022-10-26T00:18:40Z | 2022-10-26T00:18:40Z | OWNER | Another thought about tokens that can act on behalf of the user. Imagine a user has permission to access a table. They create a token that can create that table... but then their permission is revoked. It would be bad if they could still use that token they created earlier to access that table! On that basis, I think the model described above where tokens mainly work to provide an "act on behalf of this actor" - but with optional additional constraints - is a good one. |
{ "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 | |
1291272612 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291272612 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M90Gk | simonw 9599 | 2022-10-26T00:16:53Z | 2022-10-26T00:16:53Z | OWNER | Next step: make these tokens actually do something. |
{ "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 | |
1291272414 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291272414 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M90De | simonw 9599 | 2022-10-26T00:16:28Z | 2022-10-26T00:16:28Z | OWNER | If I'm going to change the naming conventions for settings I should do it before Datasette 1.0. |
{ "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 | |
1291271580 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291271580 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M9z2c | simonw 9599 | 2022-10-26T00:14:49Z | 2022-10-26T00:15:06Z | OWNER | If I'm going to have a setting to disable this feature I need to decide what it will be called. Closest existing setting is this one, since it's for a feature that is turned on by default:
So maybe this?
I like
|
{ "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 | |
1291270227 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291270227 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M9zhT | simonw 9599 | 2022-10-26T00:12:18Z | 2022-10-26T00:12:18Z | OWNER | Demo is now live at https://latest-1-0-dev.datasette.io/-/create-token - visit https://latest-1-0-dev.datasette.io/login-as-root first to sign in. |
{ "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 | |
1291269607 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291269607 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M9zXn | simonw 9599 | 2022-10-26T00:11:15Z | 2022-10-26T00:11:15Z | OWNER | If you click "Create token" for "Token never expires" multiple times you currently get exactly the same token each time, since it's just a signed token containing a copy of your actor dictionary. I'm not sure if I like that. I could give each token a random ID (maybe using |
{ "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 | |
1291268380 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291268380 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M9zEc | simonw 9599 | 2022-10-26T00:09:06Z | 2022-10-26T00:09:06Z | OWNER | Demo: |
{ "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 | |
1291243333 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291243333 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M9s9F | simonw 9599 | 2022-10-25T23:25:13Z | 2022-10-25T23:25:13Z | OWNER | A |
{ "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 | |
1291234262 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291234262 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M9qvW | simonw 9599 | 2022-10-25T23:11:23Z | 2022-10-25T23:11:23Z | OWNER | I'm going to build an initial |
{ "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 | |
1291233652 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291233652 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M9ql0 | simonw 9599 | 2022-10-25T23:10:20Z | 2022-10-25T23:10:44Z | OWNER | In which case the token would need to duplicate the current |
{ "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 | |
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 | |
1291231651 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291231651 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M9qGj | simonw 9599 | 2022-10-25T23:07:17Z | 2022-10-25T23:07:17Z | OWNER | Interesting challenge: what permissions should users be allowed to grant to tokens? Clearly a user should not be able to create a token with a permission that the user themselves does not have. And should there be a permission that allows people to create tokens? I think so. |
{ "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 | |
1291228502 | https://github.com/simonw/datasette/issues/1851#issuecomment-1291228502 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5M9pVW | eyeseast 25778 | 2022-10-25T23:02:10Z | 2022-10-25T23:02:10Z | CONTRIBUTOR | That's reasonable. Canned queries and custom endpoints are certainly going to give more room for specific needs. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1291227942 | https://github.com/simonw/datasette/issues/1852#issuecomment-1291227942 | https://api.github.com/repos/simonw/datasette/issues/1852 | IC_kwDOBm6k_c5M9pMm | simonw 9599 | 2022-10-25T23:01:18Z | 2022-10-25T23:01:18Z | OWNER | Datasette currently defaults to having everything public-readable by default, unless a permission plugin changes that default. In thinking more about this API mechanism, I realized that it might be good to have a mode where Datasette doesn't default to public everything. Maybe Might even be an opportunity to get rid of the current slightly confusing mechanism where permission checks can announce that they should default to true: |
{ "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 | |
1291226367 | https://github.com/simonw/datasette/issues/1851#issuecomment-1291226367 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5M9oz_ | simonw 9599 | 2022-10-25T22:58:30Z | 2022-10-25T22:58:30Z | OWNER | The I think this API mechanism is going to be a bit less exciting than that - it will be low-level for inserting rows, and if you want to do something fancier you can use a canned query that feeds incoming GeoJSON to a SpatiaLite function instead. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to insert a single record into an existing table 1421544654 | |
1291216193 | https://github.com/simonw/sqlite-utils/issues/505#issuecomment-1291216193 | https://api.github.com/repos/simonw/sqlite-utils/issues/505 | IC_kwDOCGYnMM5M9mVB | simonw 9599 | 2022-10-25T22:41:16Z | 2022-10-25T22:41:16Z | OWNER | Tweeted about it here: https://twitter.com/simonw/status/1585038766678609921 |
{ "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 | |
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 |
|
{ "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 | |
1291170072 | https://github.com/simonw/sqlite-utils/issues/496#issuecomment-1291170072 | https://api.github.com/repos/simonw/sqlite-utils/issues/496 | IC_kwDOCGYnMM5M9bEY | simonw 9599 | 2022-10-25T21:36:12Z | 2022-10-25T21:36:12Z | OWNER | I was going to suggest using I could change |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
devrel/python api: Pylance type hinting 1393202060 | |
1291167887 | https://github.com/simonw/sqlite-utils/issues/496#issuecomment-1291167887 | https://api.github.com/repos/simonw/sqlite-utils/issues/496 | IC_kwDOCGYnMM5M9aiP | simonw 9599 | 2022-10-25T21:33:25Z | 2022-10-25T21:33:25Z | OWNER | I do care about this, but I'm not hugely experienced with types yet so I'm open to suggestions about how to do it! |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
devrel/python api: Pylance type hinting 1393202060 | |
1291166273 | https://github.com/simonw/sqlite-utils/issues/493#issuecomment-1291166273 | https://api.github.com/repos/simonw/sqlite-utils/issues/493 | IC_kwDOCGYnMM5M9aJB | simonw 9599 | 2022-10-25T21:31:15Z | 2022-10-25T21:31:15Z | OWNER | Based on the docs here I tried the following too: https://docutils.sourceforge.io/docs/user/smartquotes.html#description
But none of them had the desired effect in this particular piece of markup:
I think because this is text inside a Consider the following:
It's rendered like this: |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Tiny typographical error in install/uninstall docs 1386562662 | |
1291159549 | https://github.com/simonw/sqlite-utils/issues/495#issuecomment-1291159549 | https://api.github.com/repos/simonw/sqlite-utils/issues/495 | IC_kwDOCGYnMM5M9Yf9 | simonw 9599 | 2022-10-25T21:23:01Z | 2022-10-25T21:23:01Z | OWNER | I've decided not to explicitly document this, since it's consistent with how other parts of the library work already. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Support JSON values returned from .convert() functions 1392690202 |
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]);
user >30