issue_comments
8,358 rows where author_association = "OWNER" sorted by updated_at descending
This data as json, CSV (advanced)
user 1
- simonw 7,052
id | html_url | issue_url | node_id | user | created_at | updated_at ▲ | author_association | body | reactions | issue | performed_via_github_app |
---|---|---|---|---|---|---|---|---|---|---|---|
1296358636 | https://github.com/simonw/sqlite-utils/issues/506#issuecomment-1296358636 | https://api.github.com/repos/simonw/sqlite-utils/issues/506 | IC_kwDOCGYnMM5NRNzs | simonw 9599 | 2022-10-30T21:52:11Z | 2022-10-30T21:52:11Z | OWNER | This could work in a similar way to |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Make `cursor.rowcount` accessible (wontfix) 1429029604 | |
1296343716 | https://github.com/simonw/datasette/issues/1873#issuecomment-1296343716 | https://api.github.com/repos/simonw/datasette/issues/1873 | IC_kwDOBm6k_c5NRKKk | simonw 9599 | 2022-10-30T20:24:55Z | 2022-10-30T20:24:55Z | OWNER | I think the key feature I need here is going to be the equivalent of |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Ensure insert API has good tests for rowid and compound primark key tables 1428630253 | |
1296343317 | https://github.com/simonw/datasette/issues/1873#issuecomment-1296343317 | https://api.github.com/repos/simonw/datasette/issues/1873 | IC_kwDOBm6k_c5NRKEV | simonw 9599 | 2022-10-30T20:22:40Z | 2022-10-30T20:22:40Z | OWNER | So maybe they're not actually worth worrying about separately, because they are guaranteed to have a primary key set. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Ensure insert API has good tests for rowid and compound primark key tables 1428630253 | |
1296343173 | https://github.com/simonw/datasette/issues/1873#issuecomment-1296343173 | https://api.github.com/repos/simonw/datasette/issues/1873 | IC_kwDOBm6k_c5NRKCF | simonw 9599 | 2022-10-30T20:21:54Z | 2022-10-30T20:22:20Z | OWNER | One last case to consider: https://www.sqlite.org/withoutrowid.html
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Ensure insert API has good tests for rowid and compound primark key tables 1428630253 | |
1296343014 | https://github.com/simonw/datasette/issues/1873#issuecomment-1296343014 | https://api.github.com/repos/simonw/datasette/issues/1873 | IC_kwDOBm6k_c5NRJ_m | simonw 9599 | 2022-10-30T20:21:01Z | 2022-10-30T20:21:01Z | OWNER | Actually, for simplicity I'm going to say that you can always set the primary key, even for auto-incrementing primary key columns... but you cannot set it on pure |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Ensure insert API has good tests for rowid and compound primark key tables 1428630253 | |
1296342814 | https://github.com/simonw/datasette/issues/1873#issuecomment-1296342814 | https://api.github.com/repos/simonw/datasette/issues/1873 | IC_kwDOBm6k_c5NRJ8e | simonw 9599 | 2022-10-30T20:20:05Z | 2022-10-30T20:20:05Z | OWNER | Some notes on what Datasette does already https://latest.datasette.io/fixtures/tags.json?_shape=array returns:
https://latest.datasette.io/fixtures/binary_data.json?_shape=array
https://latest.datasette.io/fixtures/simple_primary_key.json?_shape=array
https://latest.datasette.io/fixtures/compound_primary_key.json?_shape=array
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Ensure insert API has good tests for rowid and compound primark key tables 1428630253 | |
1296341469 | https://github.com/simonw/datasette/issues/1873#issuecomment-1296341469 | https://api.github.com/repos/simonw/datasette/issues/1873 | IC_kwDOBm6k_c5NRJnd | simonw 9599 | 2022-10-30T20:13:50Z | 2022-10-30T20:13:50Z | OWNER | I checked and SQLite itself does allow you to set the |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Ensure insert API has good tests for rowid and compound primark key tables 1428630253 | |
1296341055 | https://github.com/simonw/datasette/issues/1873#issuecomment-1296341055 | https://api.github.com/repos/simonw/datasette/issues/1873 | IC_kwDOBm6k_c5NRJg_ | simonw 9599 | 2022-10-30T20:11:47Z | 2022-10-30T20:12:30Z | OWNER | If a table has an auto-incrementing primary key, should you be allowed to insert records with an explicit key into it? I'm torn on this one. It's something you can do with direct database access, but it's something I very rarely want to do. I'm inclined to disallow it and say that if you want that you can get it using a writable canned query instead. Likewise, I'm not going to provide a way to set the |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Ensure insert API has good tests for rowid and compound primark key tables 1428630253 | |
1296339386 | https://github.com/simonw/datasette/issues/1871#issuecomment-1296339386 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5NRJG6 | simonw 9599 | 2022-10-30T20:03:04Z | 2022-10-30T20:03:04Z | OWNER | I do need to skip CSRF for these API calls. I'm going to start out by doing that using the
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1296339205 | https://github.com/simonw/datasette/issues/1871#issuecomment-1296339205 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5NRJEF | simonw 9599 | 2022-10-30T20:02:05Z | 2022-10-30T20:02:05Z | OWNER | Realized the API explorer doesn't need the API key piece at all - it can work with standard cookie-based auth. This also reflects how most plugins are likely to use this API, where they'll be adding JavaScript that uses |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1296131872 | https://github.com/simonw/datasette/issues/1871#issuecomment-1296131872 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5NQWcg | simonw 9599 | 2022-10-30T06:27:56Z | 2022-10-30T06:27:56Z | OWNER | Initial prototype API explorer is now live at https://latest-1-0-dev.datasette.io/-/api |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1296131681 | https://github.com/simonw/datasette/issues/1873#issuecomment-1296131681 | https://api.github.com/repos/simonw/datasette/issues/1873 | IC_kwDOBm6k_c5NQWZh | simonw 9599 | 2022-10-30T06:27:12Z | 2022-10-30T06:27:12Z | OWNER | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Ensure insert API has good tests for rowid and compound primark key tables 1428630253 | ||
1296131343 | https://github.com/simonw/datasette/issues/1872#issuecomment-1296131343 | https://api.github.com/repos/simonw/datasette/issues/1872 | IC_kwDOBm6k_c5NQWUP | simonw 9599 | 2022-10-30T06:26:01Z | 2022-10-30T06:26:01Z | OWNER | Good spot fixing that! Sorry about this - it was a change in Datasette 0.63 which should have been better called out. My goal for Datasette 1.0 (which I aim to have out by the end of the year) is to introduce a formal process for avoiding problems like this, with very clear documentation when something like this might happen. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
SITE-BUSTING ERROR: "render_template() called before await ds.invoke_startup()" 1428560020 | |
1296130073 | https://github.com/simonw/datasette/issues/1871#issuecomment-1296130073 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5NQWAZ | simonw 9599 | 2022-10-30T06:20:56Z | 2022-10-30T06:20:56Z | OWNER | That initial prototype looks like this: It currently shows the returned JSON from the API in an |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1296126389 | https://github.com/simonw/datasette/issues/1871#issuecomment-1296126389 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5NQVG1 | simonw 9599 | 2022-10-30T06:04:48Z | 2022-10-30T06:04:48Z | OWNER | This is even more important now I have pushed: - #1866 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1296114136 | https://github.com/simonw/datasette/issues/1871#issuecomment-1296114136 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5NQSHY | simonw 9599 | 2022-10-30T05:15:40Z | 2022-10-30T05:15:40Z | OWNER | Host it at It's an input box with a path in and a textarea you can put JSON in, plus a submit button to post the request. It lists the API endpoints you can use - click on a link to populate the form field plus a example. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1295660092 | https://github.com/simonw/datasette/pull/1870#issuecomment-1295660092 | https://api.github.com/repos/simonw/datasette/issues/1870 | IC_kwDOBm6k_c5NOjQ8 | simonw 9599 | 2022-10-29T00:25:26Z | 2022-10-29T00:25:26Z | OWNER | Saw your comment here too: https://github.com/simonw/datasette/issues/1480#issuecomment-1271101072
So maybe we need a special case for containers that are intended to be run using Docker - the ones produced by Maybe a I should run some benchmarks to figure out if |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
don't use immutable=1, only mode=ro 1426379903 | |
1295657771 | https://github.com/simonw/datasette/pull/1870#issuecomment-1295657771 | https://api.github.com/repos/simonw/datasette/issues/1870 | IC_kwDOBm6k_c5NOisr | simonw 9599 | 2022-10-29T00:19:03Z | 2022-10-29T00:19:03Z | OWNER | Just saw your comment here: https://github.com/simonw/datasette/issues/1836#issuecomment-1272357976
I don't understand this. My mental model of how Docker works is that the image itself is created using Are you saying that I can build a container, but then when I run it and it does |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
don't use immutable=1, only mode=ro 1426379903 | |
1295200988 | https://github.com/simonw/datasette/issues/1866#issuecomment-1295200988 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NMzLc | simonw 9599 | 2022-10-28T16:29:55Z | 2022-10-28T16:29:55Z | OWNER | I wonder if there's something clever I could do here within a transaction? Start a transaction. Write out a temporary in-memory table with all of the existing primary keys in the table. Run the bulk insert. Then run I don't think that's going to work well for large tables. I'm going to go with not returning inserted rows by default, unless you pass a special option requesting that. |
{ "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 | |
1294316640 | https://github.com/simonw/datasette/issues/1866#issuecomment-1294316640 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NJbRg | simonw 9599 | 2022-10-28T01:51:40Z | 2022-10-28T01:51:40Z | OWNER | This needs to support the following: - Rows do not include a primary key - one is assigned by the database - Rows provide their own primary key, any clashes are errors - Rows provide their own primary key, clashes are silently ignored - Rows provide their own primary key, replacing any existing records |
{ "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 | |
1294306071 | https://github.com/simonw/datasette/issues/1866#issuecomment-1294306071 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NJYsX | simonw 9599 | 2022-10-28T01:37:14Z | 2022-10-28T01:37:59Z | OWNER | Quick crude benchmark: ```python import sqlite3 db = sqlite3.connect(":memory:") def create_table(db, name): db.execute(f"create table {name} (id integer primary key, title text)") create_table(db, "single") create_table(db, "multi") create_table(db, "bulk") def insert_singles(titles): inserted = [] for title in titles: cursor = db.execute(f"insert into single (title) values (?)", [title]) inserted.append((cursor.lastrowid, title)) return inserted def insert_many(titles): db.executemany(f"insert into multi (title) values (?)", ((t,) for t in titles)) def insert_bulk(titles): db.execute("insert into bulk (title) values {}".format( ", ".join("(?)" for _ in titles) ), titles) titles = ["title {}".format(i) for i in range(1, 10001)]
In [13]: %timeit insert_many(titles) 12 ms ± 520 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) In [12]: %timeit insert_bulk(titles) 2.59 ms ± 25 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) ``` So the bulk insert really is a lot faster - 3ms compared to 24ms for single inserts, so ~8x faster. |
{ "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 | |
1294296767 | https://github.com/simonw/datasette/issues/1866#issuecomment-1294296767 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NJWa_ | simonw 9599 | 2022-10-28T01:22:25Z | 2022-10-28T01:23:09Z | OWNER | Nasty catch on this one: I wanted to return the IDs of the freshly inserted rows. But... the SQLite itself added a Two options then:
That third option might be the way to go here. I should benchmark first to figure out how much of a difference this actually makes. |
{ "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 | |
1294282263 | https://github.com/simonw/datasette/issues/1866#issuecomment-1294282263 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5NJS4X | simonw 9599 | 2022-10-28T01:00:42Z | 2022-10-28T01:00:42Z | OWNER | I'm going to set the limit at 1,000 rows inserted at a time. I'll make this configurable using a new |
{ "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 | |
1294281451 | https://github.com/simonw/datasette/issues/1851#issuecomment-1294281451 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NJSrr | simonw 9599 | 2022-10-28T00:59:25Z | 2022-10-28T00:59:25Z | OWNER | I'm going to use this endpoint for bulk inserts too, so I'm closing this issue and continuing the work here: - #1866 |
{ "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 | |
1289712350 | https://github.com/simonw/datasette/issues/1851#issuecomment-1289712350 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5M33Le | simonw 9599 | 2022-10-24T22:28:39Z | 2022-10-27T23:18:48Z | OWNER | API design: (**UPDATE: this was later changed to POST /db/table/-/insert)
I decided to use |
{ "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 | |
1294181485 | https://github.com/simonw/datasette/issues/1869#issuecomment-1294181485 | https://api.github.com/repos/simonw/datasette/issues/1869 | IC_kwDOBm6k_c5NI6Rt | simonw 9599 | 2022-10-27T22:24:37Z | 2022-10-27T22:24:37Z | OWNER | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Release 0.63 1426253476 | ||
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 | |
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 | |
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 | |
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 | |
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 | |
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 |
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]);
issue >30