issue_comments
10,495 rows sorted by updated_at descending
This data as json, CSV (advanced)
user 323
- simonw 7,646
- codecov[bot] 173
- fgregg 68
- eyeseast 60
- russss 39
- psychemedia 34
- abdusco 26
- mroswell 22
- aborruso 19
- chrismp 18
- jacobian 14
- carlmjohnson 14
- brandonrobertz 14
- chapmanjacobd 14
- RhetTbull 14
- tballison 13
- wragge 12
- tsibley 11
- rixx 11
- stonebig 11
- dependabot[bot] 11
- frafra 10
- terrycojones 10
- rayvoelker 10
- maxhawkins 9
- clausjuhl 9
- bobwhitelock 9
- 20after4 8
- dracos 8
- UtahDave 8
- tomchristie 8
- bsilverm 8
- rgieseke 7
- zaneselvans 7
- mhalle 7
- zeluspudding 7
- cobiadigital 7
- amjith 6
- jefftriplett 6
- simonwiles 6
- khimaros 6
- CharlesNepote 6
- khusmann 5
- jaywgraves 5
- MarkusH 5
- dazzag24 5
- ocdtrekkie 5
- SteadBytes 5
- dependabot-preview[bot] 5
- jayvdb 4
- fs111 4
- bollwyvl 4
- ctb 4
- Btibert3 4
- dholth 4
- lovasoa 4
- r4vi 4
- jsfenfen 4
- glasnt 4
- jungle-boogie 4
- ColinMaudry 4
- kbaikov 4
- JBPressac 4
- nitinpaultifr 4
- Kabouik 4
- asg017 4
- henry501 4
- pjamargh 4
- davidbgk 3
- benpickles 3
- frankieroberto 3
- obra 3
- janimo 3
- atomotic 3
- ghing 3
- pkoppstein 3
- yozlet 3
- yschimke 3
- philroche 3
- macropin 3
- camallen 3
- wsxiaoys 3
- johnfelipe 3
- mdrovdahl 3
- xrotwang 3
- Mjboothaus 3
- robroc 3
- betatim 3
- dufferzafar 3
- Florents-Tselai 3
- ashishdotme 3
- Segerberg 3
- hydrosquall 3
- blairdrummond 3
- jsancho-gpl 3
- kevindkeogh 3
- daniel-butler 3
- learning4life 3
- mattmalcher 3
- FabianHertwig 3
- polyrand 3
- garethr 2
- danp 2
- nelsonjchen 2
- hubgit 2
- ftrain 2
- chrishas35 2
- tannewt 2
- ingenieroariel 2
- coleifer 2
- gavinband 2
- aviflax 2
- tholo 2
- cldellow 2
- mungewell 2
- frankier 2
- lchski 2
- tmaier 2
- gfrmin 2
- frosencrantz 2
- eads 2
- leafgarland 2
- glyph 2
- rafguns 2
- strada 2
- adipasquale 2
- eelkevdbos 2
- ligurio 2
- n8henrie 2
- soobrosa 2
- nathancahill 2
- davidleejy 2
- bsmithgall 2
- willingc 2
- nattaylor 2
- durkie 2
- raynae 2
- wulfmann 2
- philshem 2
- bram2000 2
- zzeleznick 2
- chris48s 2
- plpxsk 2
- jeqo 2
- henrikek 2
- swyxio 2
- nickvazz 2
- aaronyih1 2
- luxint 2
- jussiarpalahti 2
- lagolucas 2
- chekos 2
- ad-si 2
- smithdc1 2
- justmars 2
- gsajko 2
- jcmkk3 2
- null92 2
- rachelmarconi 2
- tunguyenatwork 2
- LVerneyPEReN 2
- MichaelTiemannOSC 2
- anotherjesse 1
- jarib 1
- jokull 1
- fernand0 1
- dsisnero 1
- llimllib 1
- gijs 1
- blaine 1
- ashanan 1
- gravis 1
- nkirsch 1
- tomdyson 1
- mrchrisadams 1
- dkam 1
- harperreed 1
- nileshtrivedi 1
- furilo 1
- kindly 1
- adamwolf 1
- prabhur 1
- palfrey 1
- dmd 1
- rubenv 1
- Uninen 1
- carsonyl 1
- nryberg 1
- step21 1
- stefanocudini 1
- rcoup 1
- scoates 1
- hpk42 1
- annapowellsmith 1
- aslakr 1
- thorn0 1
- yurivish 1
- lucapette 1
- jmelloy 1
- Krazybug 1
- dvhthomas 1
- dckc 1
- phubbard 1
- sethvincent 1
- mcarpenter 1
- meatcar 1
- aitoehigie 1
- michaelmcandrew 1
- drewda 1
- stiles 1
- saulpw 1
- thadk 1
- robintw 1
- astrojuanlu 1
- ipmb 1
- steren 1
- aidansteele 1
- mikepqr 1
- 0x1997 1
- knutwannheden 1
- davidszotten 1
- kevboh 1
- eaubin 1
- yunzheng 1
- lfdebrux 1
- karlcow 1
- heyarne 1
- amitkoth 1
- ryanfox 1
- ryascott 1
- simonrjones 1
- mcint 1
- justinpinkney 1
- merwok 1
- mattkiefer 1
- virtadpt 1
- snth 1
- joshmgrant 1
- bcongdon 1
- nickdirienzo 1
- adamjonas 1
- hannseman 1
- kaihendry 1
- urbas 1
- brimstone 1
- adamchainz 1
- PabloLerma 1
- heussd 1
- RayBB 1
- limar 1
- drkane 1
- Gagravarr 1
- agguser 1
- dyllan-to-you 1
- justinallen 1
- jordaneremieff 1
- wdccdw 1
- mustafa0x 1
- wpears 1
- progpow 1
- ltrgoddard 1
- costrouc 1
- jratike80 1
- ment4list 1
- ccorcos 1
- noslouch 1
- qqilihq 1
- OverkillGuy 1
- QAInsights 1
- secretGeek 1
- fkuhn 1
- jameslittle230 1
- Profpatsch 1
- dskrad 1
- kwladyka 1
- Carib0u 1
- fatihky 1
- phoenixjun 1
- JesperTreetop 1
- bapowell 1
- louispotok 1
- ChristopherWilks 1
- Maltazar 1
- eumiro 1
- wuhland 1
- foscoj 1
- dvot197007 1
- kokes 1
- RamiAwar 1
- csusanu 1
- rprimet 1
- metab0t 1
- spdkils 1
- sturzl 1
- robmarkcole 1
- jfeiwell 1
- coisnepe 1
- chmaynard 1
- sachaj 1
- bendnorman 1
- noklam 1
- stevecrawshaw 1
- eigenfoo 1
- GmGniap 1
- rdtq 1
- AnkitKundariya 1
- LucasElArruda 1
- duarteocarmo 1
- mattiaborsoi 1
- sarcasticadmin 1
- abeyerpath 1
- b0b5h4rp13 1
- Rik-de-Kort 1
- patricktrainer 1
- xmichele 1
- miuku 1
- thewchan 1
- publicmatt 1
- izzues 1
- thisismyfuckingusername 1
- kirajano 1
- knowledgecamp12 1
- McEazy2700 1
id | html_url | issue_url | node_id | user | created_at | updated_at ▲ | author_association | body | reactions | issue | performed_via_github_app |
---|---|---|---|---|---|---|---|---|---|---|---|
1313962183 | https://github.com/simonw/datasette/issues/1884#issuecomment-1313962183 | https://api.github.com/repos/simonw/datasette/issues/1884 | IC_kwDOBm6k_c5OUXjH | eyeseast 25778 | 2022-11-14T15:46:32Z | 2022-11-14T15:46:32Z | CONTRIBUTOR | It does work, though I think it's probably still worth excluding virtual tables that will always be zero. Here's the same inspection as before, now with
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Exclude virtual tables from datasette inspect 1439009231 | |
1313271719 | https://github.com/simonw/datasette/issues/1886#issuecomment-1313271719 | https://api.github.com/repos/simonw/datasette/issues/1886 | IC_kwDOBm6k_c5ORu-n | lucapette 124274 | 2022-11-14T08:25:12Z | 2022-11-14T08:25:12Z | NONE | Nothing spectacular yet but I think this falls under "cool/cute application of datasette": improving fakedata performance for fun. tl;dr I used datasette to visualize benchmarking data. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Call for birthday presents: if you're using Datasette, let us know how you're using it here 1447050738 | |
1313252879 | https://github.com/simonw/datasette/issues/1886#issuecomment-1313252879 | https://api.github.com/repos/simonw/datasette/issues/1886 | IC_kwDOBm6k_c5ORqYP | adipasquale 883348 | 2022-11-14T08:10:23Z | 2022-11-14T08:10:23Z | CONTRIBUTOR | Hi @simonw and thanks for the great tools you're publishing, your dedication is inspiring! I work for the French Ministry of Culture on a surveying tool for objects protected for their historical value. It is part of a program building modern public services called beta.gouv.fr. In that context I'm using data published by the Ministry that I have ingested into datasette and published on a free Fly instance : https://collectif-objets-datasette.fly.dev . I have also ingested another data set with infos about french cities on this instance so that I can perform joined queries. The surveying tool synchronizes its data regularly from this datasette instance, and I also use it to perform queries when asked generic questions about the distribution of objects. (The data is not very accessible as it's undocumented and for internal usage mostly) |
{ "total_count": 3, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 3, "rocket": 0, "eyes": 0 } |
Call for birthday presents: if you're using Datasette, let us know how you're using it here 1447050738 | |
1313156167 | https://github.com/simonw/datasette/issues/1850#issuecomment-1313156167 | https://api.github.com/repos/simonw/datasette/issues/1850 | IC_kwDOBm6k_c5ORSxH | simonw 9599 | 2022-11-14T06:23:39Z | 2022-11-14T06:23:39Z | OWNER | The API explorer is now live here: 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 } |
Write API in Datasette core 1421529723 | |
1313155712 | https://github.com/simonw/datasette/issues/1850#issuecomment-1313155712 | https://api.github.com/repos/simonw/datasette/issues/1850 | IC_kwDOBm6k_c5ORSqA | simonw 9599 | 2022-11-14T06:22:57Z | 2022-11-14T06:22:57Z | OWNER | I think the ability to create tokens should be protected by a |
{ "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 | |
1313139657 | https://github.com/simonw/datasette/issues/1888#issuecomment-1313139657 | https://api.github.com/repos/simonw/datasette/issues/1888 | IC_kwDOBm6k_c5OROvJ | simonw 9599 | 2022-11-14T06:04:48Z | 2022-11-14T06:04:48Z | OWNER | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer should take immutability into account 1447439985 | ||
1313128913 | https://github.com/simonw/datasette/issues/1866#issuecomment-1313128913 | https://api.github.com/repos/simonw/datasette/issues/1866 | IC_kwDOBm6k_c5ORMHR | simonw 9599 | 2022-11-14T05:48:22Z | 2022-11-14T05:48:22Z | OWNER | I changed my mind about the |
{ "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 | |
1313127054 | https://github.com/simonw/datasette/issues/1874#issuecomment-1313127054 | https://api.github.com/repos/simonw/datasette/issues/1874 | IC_kwDOBm6k_c5ORLqO | simonw 9599 | 2022-11-14T05:45:00Z | 2022-11-14T05:45:00Z | OWNER | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to drop a table 1429030341 | ||
1313125870 | https://github.com/simonw/datasette/issues/1871#issuecomment-1313125870 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5ORLXu | simonw 9599 | 2022-11-14T05:42:50Z | 2022-11-14T05:42:50Z | OWNER | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | ||
1313125123 | https://github.com/simonw/datasette/issues/1874#issuecomment-1313125123 | https://api.github.com/repos/simonw/datasette/issues/1874 | IC_kwDOBm6k_c5ORLMD | simonw 9599 | 2022-11-14T05:41:20Z | 2022-11-14T05:42:23Z | OWNER | I also changed the confirmation JSON returned by this endpoint to add the |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to drop a table 1429030341 | |
1313119558 | https://github.com/simonw/datasette/issues/1874#issuecomment-1313119558 | https://api.github.com/repos/simonw/datasette/issues/1874 | IC_kwDOBm6k_c5ORJ1G | simonw 9599 | 2022-11-14T05:30:27Z | 2022-11-14T05:30:27Z | OWNER | Found a bug: you get a 500 error if you try this against an immutable database. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API to drop a table 1429030341 | |
1313115059 | https://github.com/simonw/datasette/issues/1850#issuecomment-1313115059 | https://api.github.com/repos/simonw/datasette/issues/1850 | IC_kwDOBm6k_c5ORIuz | simonw 9599 | 2022-11-14T05:21:30Z | 2022-11-14T05:21:30Z | OWNER | New documentation for these features currently lives here: https://docs.datasette.io/en/1.0-dev/json_api.html#the-json-write-api |
{ "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 | |
1313114283 | https://github.com/simonw/datasette/issues/1875#issuecomment-1313114283 | https://api.github.com/repos/simonw/datasette/issues/1875 | IC_kwDOBm6k_c5ORIir | simonw 9599 | 2022-11-14T05:20:00Z | 2022-11-14T05:20:00Z | OWNER | I started a conversation about JSON error standards on Mastodon here: https://fedi.simonwillison.net/web/@simon/109338725610487457 Quite a few people pointed to this RFC independently. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Figure out design for JSON errors (consider RFC 7807) 1430797211 | |
1313113642 | https://github.com/simonw/datasette/issues/1887#issuecomment-1313113642 | https://api.github.com/repos/simonw/datasette/issues/1887 | IC_kwDOBm6k_c5ORIYq | simonw 9599 | 2022-11-14T05:18:51Z | 2022-11-14T05:18:51Z | OWNER | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Add a confirm step to the drop table API 1447388809 | ||
1313097713 | https://github.com/simonw/datasette/issues/1887#issuecomment-1313097713 | https://api.github.com/repos/simonw/datasette/issues/1887 | IC_kwDOBm6k_c5OREfx | simonw 9599 | 2022-11-14T05:00:54Z | 2022-11-14T05:00:54Z | OWNER | I'm going to add a |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Add a confirm step to the drop table API 1447388809 | |
1313097057 | https://github.com/simonw/datasette/issues/1871#issuecomment-1313097057 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5OREVh | simonw 9599 | 2022-11-14T04:59:28Z | 2022-11-14T04:59:28Z | OWNER | In playing with the API explorer just now I realized it's way too easy to accidentally drop a table using it. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1313072900 | https://github.com/simonw/datasette/issues/1871#issuecomment-1313072900 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5OQ-cE | simonw 9599 | 2022-11-14T04:15:50Z | 2022-11-14T04:15:50Z | OWNER | For the example links - I'm going to have these at the bottom of the page so you don't have to scroll past them. Ideally these would take the user's permissions into account. This could make the page expensive to load, but I'm going to risk it for the moment. Something like this then:
I won't bother with per-row demo links (for update and delete) because there could be thousands of them for each table. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1313062699 | https://github.com/simonw/datasette/issues/1871#issuecomment-1313062699 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5OQ78r | simonw 9599 | 2022-11-14T04:03:29Z | 2022-11-14T04:12:41Z | OWNER | Two things left before I close this issue:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1313052863 | https://github.com/simonw/datasette/issues/1886#issuecomment-1313052863 | https://api.github.com/repos/simonw/datasette/issues/1886 | IC_kwDOBm6k_c5OQ5i_ | simonw 9599 | 2022-11-14T03:40:50Z | 2022-11-14T03:40:50Z | OWNER | Tim Sherratt on Twitter: https://twitter.com/wragge/status/1591930345469153282
|
{ "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 1, "rocket": 0, "eyes": 0 } |
Call for birthday presents: if you're using Datasette, let us know how you're using it here 1447050738 | |
1312898318 | https://github.com/simonw/datasette/issues/1886#issuecomment-1312898318 | https://api.github.com/repos/simonw/datasette/issues/1886 | IC_kwDOBm6k_c5OQT0O | eigenfoo 19851673 | 2022-11-14T00:52:16Z | 2022-11-14T00:52:16Z | NONE | I'm a cryptic crossword enthusiast and have spent a lot of time scraping and parsing cryptic crossword clues from various blogs, forums and publications. The result is over half a million clues from cryptic crosswords over the past twelve years, including the clue, answer, puzzle date, puzzle name and a link to the original source. This is all hosted using Datasette, which has been a delight to use: https://cryptics.georgeho.org/ This dataset is a significant work of crossword archivism and scholarship, as acquiring historical crosswords and structuring their contents require focused effort and tedious cleaning that few are willing to do for such trivial data - for example, according to this 2004 selection guide, the Library of Congress explicitly does not collect crossword puzzles. Anecdotally, I know that many constructors/setters of cryptic crosswords use this dataset as a resource, and some even simply call it "the database" - this is probably one of the most impactful data projects I've worked on! |
{ "total_count": 1, "+1": 0, "-1": 0, "laugh": 0, "hooray": 1, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Call for birthday presents: if you're using Datasette, let us know how you're using it here 1447050738 | |
1312822353 | https://github.com/simonw/datasette/issues/1871#issuecomment-1312822353 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5OQBRR | simonw 9599 | 2022-11-13T21:07:40Z | 2022-11-13T21:07:40Z | OWNER | I'm going to need extra code to toggle POST closed when GET opens and vice-versa. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1312821031 | https://github.com/simonw/datasette/issues/1871#issuecomment-1312821031 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5OQA8n | simonw 9599 | 2022-11-13T21:02:06Z | 2022-11-13T21:03:11Z | OWNER | Actually no, I'm going to add a class of |
{ "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1312816451 | https://github.com/simonw/datasette/issues/1871#issuecomment-1312816451 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5OP_1D | simonw 9599 | 2022-11-13T20:39:26Z | 2022-11-13T20:39:34Z | OWNER | I'm going to add a special |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1312816292 | https://github.com/simonw/datasette/issues/1871#issuecomment-1312816292 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5OP_yk | simonw 9599 | 2022-11-13T20:38:42Z | 2022-11-13T20:38:42Z | OWNER | The current API explorer uses details/summary elements for the GET and POST dialogs. I only want one of these to be open at a time, to reflect that you can make either a GET or a POST. I just noticed that clicking anywhere else on the page closes both elements, which isn't what I want to happen. Turns out that's because of this code I added as part of Datasette's menu implementation! |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1312814245 | https://github.com/simonw/datasette/issues/1886#issuecomment-1312814245 | https://api.github.com/repos/simonw/datasette/issues/1886 | IC_kwDOBm6k_c5OP_Sl | noslouch 2090382 | 2022-11-13T20:28:26Z | 2022-11-13T20:28:26Z | NONE | I work at The Wall Street Journal as a computational journalist and serve as our self-appointed Datasette evangelist. They say that to a hammer everything looks like a nail, but the reality is newsrooms find themselves in a sea of nails! I've only got a couple public projects that I can share, but happy to offer you a look at some of the internal projects. More often than not the internal projects stay internal because the reporting doesn't lead anywhere or I can't convince an editor to greenlight it. But imho that's the beauty of datasette: a (relatively) painless mechanism to see if there's any there there.
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Call for birthday presents: if you're using Datasette, let us know how you're using it here 1447050738 | |
1312582512 | https://github.com/simonw/datasette/issues/1882#issuecomment-1312582512 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5OPGtw | simonw 9599 | 2022-11-12T22:11:18Z | 2022-11-12T22:11:18Z | OWNER | I like this:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1312581121 | https://github.com/simonw/datasette/issues/1882#issuecomment-1312581121 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5OPGYB | simonw 9599 | 2022-11-12T22:01:32Z | 2022-11-12T22:01:32Z | OWNER | I'm going to change it to |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1312581008 | https://github.com/simonw/datasette/issues/1882#issuecomment-1312581008 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5OPGWQ | simonw 9599 | 2022-11-12T22:00:52Z | 2022-11-12T22:00:52Z | OWNER | Tried out my prototype in the API explorer: The Problem is I really like |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1312580348 | https://github.com/simonw/datasette/issues/1882#issuecomment-1312580348 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5OPGL8 | simonw 9599 | 2022-11-12T21:55:54Z | 2022-11-12T21:56:45Z | OWNER | What should this API return? I think the name of the table ( |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1312575048 | https://github.com/simonw/datasette/issues/1882#issuecomment-1312575048 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5OPE5I | simonw 9599 | 2022-11-12T21:22:58Z | 2022-11-12T21:22:58Z | OWNER | Need to validate the table name. SQLite supports almost any table name - but they can't contain a newline character and cannot start with |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1312556044 | https://github.com/simonw/datasette/issues/1882#issuecomment-1312556044 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5OPAQM | simonw 9599 | 2022-11-12T19:29:11Z | 2022-11-12T19:29:11Z | OWNER | Thought of an edge-case: with
How could this new API support that? I thought about adding a This doesn't feel right to me - I want to keep those options here, on One idea I had was to implement it such that you can call But instead, I'm going to outsource this to the CLI tool I plan to write that feeds data into this API. I'm already planning to use that tool for CSV inserts (so the API doesn't need to accept CSV directly). I think it's a good place for other usability enhancements like "insert this, creating the table if it does not exist" as well. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1312534826 | https://github.com/simonw/datasette/issues/1878#issuecomment-1312534826 | https://api.github.com/repos/simonw/datasette/issues/1878 | IC_kwDOBm6k_c5OO7Eq | stevecrawshaw 18738650 | 2022-11-12T17:34:58Z | 2022-11-12T17:34:58Z | NONE | Hi Simon. I have just started experimenting with datasette in earnest, looking at it's suitability for air quality open data. A bulk upsert \ upsert_all would be very useful for me in enabling real time data to be pushed from a sql server database with FME server to a datasette db. An hourly process queries the last 2 hours of data and pushes that to my database, inserting new data and updating existing combinations of pk siteid and date_time. This is already implemented on our current open data portal. Excited to see your progress with this! Thank you for this amazing software. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
/db/table/-/upsert API 1432013704 | |
1311437901 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311437901 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKvRN | mattmalcher 31312775 | 2022-11-11T09:20:21Z | 2022-11-11T09:20:21Z | NONE | Amazing - thank you for fixing and releasing that so quickly and for showing your process! <3 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311314981 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311314981 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKRQl | simonw 9599 | 2022-11-11T07:15:48Z | 2022-11-11T07:15:48Z | OWNER | I released that fix in Datasette 0.63.1: https://docs.datasette.io/en/stable/changelog.html#v0-63-1 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311299535 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311299535 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKNfP | simonw 9599 | 2022-11-11T06:54:58Z | 2022-11-11T06:54:58Z | OWNER | This time deployed with:
And that fixed it!
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311292463 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311292463 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKLwv | simonw 9599 | 2022-11-11T06:44:24Z | 2022-11-11T06:44:24Z | OWNER | Modifying that test to the following does indeed cause a failure:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311291632 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311291632 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKLjw | simonw 9599 | 2022-11-11T06:43:00Z | 2022-11-11T06:43:00Z | OWNER | https://datasette-apache-proxy-demo.datasette.io/prefix/-/asgi-scope is useful: It confirms that
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311290115 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311290115 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKLMD | simonw 9599 | 2022-11-11T06:40:14Z | 2022-11-11T06:41:56Z | OWNER | I modified that config file to have this line instead:
This does NOT seem to have fixed the bug:
https://datasette-apache-proxy-demo.datasette.io/prefix/-/versions seems to confirm that this is the latest deployed version (0.63), so it looks like the deploy worked. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311286593 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311286593 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKKVB | simonw 9599 | 2022-11-11T06:34:09Z | 2022-11-11T06:34:09Z | OWNER | https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass includes this note:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311284537 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311284537 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKJ05 | simonw 9599 | 2022-11-11T06:30:38Z | 2022-11-11T06:30:38Z | OWNER | Is there a chance that it's Apache that's messing with that |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311283301 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311283301 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKJhl | simonw 9599 | 2022-11-11T06:28:38Z | 2022-11-11T06:29:33Z | OWNER |
https://github.com/simonw/datasette/blob/bbaab3b38ec2ce5944239ffbe2dd53328df40fff/datasette/utils/init.py#L273-L286 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311282970 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311282970 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKJca | simonw 9599 | 2022-11-11T06:28:05Z | 2022-11-11T06:28:05Z | OWNER | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | ||
1311280709 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311280709 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKI5F | simonw 9599 | 2022-11-11T06:25:27Z | 2022-11-11T06:25:27Z | OWNER | I tried adding this test but it passed! I expected it to fail:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311278678 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311278678 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKIZW | simonw 9599 | 2022-11-11T06:22:37Z | 2022-11-11T06:22:37Z | OWNER | If you view source on that page the HTML looks correct: ```html <form class="filters" action="/prefix/fixtures/binary_data" method="get"> ``` (I just added a test that confirms this too.) But... it looks like the bug is in the redirection code. https://datasette-apache-proxy-demo.datasette.io/prefix/fixtures/binary_data?_filter_column=rowid&_filter_op=exact&_filter_value=1&_sort=rowid returns the following: location: /fixtures/binary_data?_sort=rowid&rowid__exact=1 Which is incorrect. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311273461 | https://github.com/simonw/datasette/issues/1883#issuecomment-1311273461 | https://api.github.com/repos/simonw/datasette/issues/1883 | IC_kwDOBm6k_c5OKHH1 | simonw 9599 | 2022-11-11T06:16:08Z | 2022-11-11T06:16:08Z | OWNER | Great catch, thanks! |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Errors when using table filters behind a proxy 1435917503 | |
1311273063 | https://github.com/simonw/datasette/issues/1880#issuecomment-1311273063 | https://api.github.com/repos/simonw/datasette/issues/1880 | IC_kwDOBm6k_c5OKHBn | simonw 9599 | 2022-11-11T06:15:28Z | 2022-11-11T06:15:28Z | OWNER | The So I want to be able to paginate (and search) those. But to paginate them it's useful to have them in a database table itself, since then I can paginate using SQL. My plan for
|
{ "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Datasette with many and large databases > Memory use 1433576351 | |
1311271298 | https://github.com/simonw/datasette/issues/1880#issuecomment-1311271298 | https://api.github.com/repos/simonw/datasette/issues/1880 | IC_kwDOBm6k_c5OKGmC | simonw 9599 | 2022-11-11T06:12:29Z | 2022-11-11T06:12:29Z | OWNER | I think you may have misunderstood this feature. This is talking about the They're not a copy of the data itself - just a list of table names, column names and database names. You can see what that database looks like by signing in as root - running
For the example instance that looks like this: The two most interesting tables in there are these ones: As you can see, it's just the table schema itself and the columns that make up the tables. Even if you have hundreds of databases connected each with hundreds of tables this should still only add up to a few MB of RAM. |
{ "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Datasette with many and large databases > Memory use 1433576351 | |
1311269045 | https://github.com/simonw/datasette/issues/1884#issuecomment-1311269045 | https://api.github.com/repos/simonw/datasette/issues/1884 | IC_kwDOBm6k_c5OKGC1 | simonw 9599 | 2022-11-11T06:08:28Z | 2022-11-11T06:08:28Z | OWNER | Does that work if you add |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Exclude virtual tables from datasette inspect 1439009231 | |
1309735529 | https://github.com/simonw/datasette/issues/1884#issuecomment-1309735529 | https://api.github.com/repos/simonw/datasette/issues/1884 | IC_kwDOBm6k_c5OEPpp | eyeseast 25778 | 2022-11-10T03:57:23Z | 2022-11-10T03:57:23Z | CONTRIBUTOR | Here's how to get a list of virtual tables: https://stackoverflow.com/questions/46617118/how-to-fetch-names-of-virtual-tables |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Exclude virtual tables from datasette inspect 1439009231 | |
1309650806 | https://github.com/simonw/datasette/issues/1871#issuecomment-1309650806 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5OD692 | davidbgk 3556 | 2022-11-10T01:38:58Z | 2022-11-10T01:38:58Z | CONTRIBUTOR |
I agree (that's what I did with the previous insert plugin), maybe a complete example using |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1304539296 | https://github.com/simonw/sqlite-utils/issues/235#issuecomment-1304539296 | https://api.github.com/repos/simonw/sqlite-utils/issues/235 | IC_kwDOCGYnMM5NwbCg | ryascott 559711 | 2022-11-05T12:40:12Z | 2022-11-05T12:40:12Z | NONE | I had the problem this morning when running:
I upgraded to:
and the error did not appear anymore. Hope this helps Ryan |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Extract columns cannot create foreign key relation: sqlite3.OperationalError: table sqlite_master may not be modified 810618495 | |
1304320521 | https://github.com/simonw/sqlite-utils/issues/511#issuecomment-1304320521 | https://api.github.com/repos/simonw/sqlite-utils/issues/511 | IC_kwDOCGYnMM5NvloJ | chapmanjacobd 7908073 | 2022-11-04T22:54:09Z | 2022-11-04T22:59:54Z | CONTRIBUTOR | I ran |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
[insert_all, upsert_all] IntegrityError: constraint failed 1436539554 | |
1304078945 | https://github.com/simonw/sqlite-utils/issues/511#issuecomment-1304078945 | https://api.github.com/repos/simonw/sqlite-utils/issues/511 | IC_kwDOCGYnMM5Nuqph | chapmanjacobd 7908073 | 2022-11-04T19:38:36Z | 2022-11-04T20:13:17Z | CONTRIBUTOR | Even more bizarre, the source db only has one record and the target table has no conflicting record:
I've been able to use this code successfully several times before so not sure what's causing the issue. I guess the way that I'm handling multiple databases is an issue, though it hasn't ever inserted into the source db, not sure what's different. The only reasonable explanation is that it is trying to insert into the source db from the source db for some reason? Or maybe sqlite3 is checking the source db for primary key violation because the table name is the same |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
[insert_all, upsert_all] IntegrityError: constraint failed 1436539554 | |
1302818784 | https://github.com/simonw/datasette/issues/1882#issuecomment-1302818784 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5Np2_g | simonw 9599 | 2022-11-04T00:25:18Z | 2022-11-04T16:12:39Z | OWNER | On that basis I think the core API design should change to this:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1303660293 | https://github.com/simonw/sqlite-utils/issues/50#issuecomment-1303660293 | https://api.github.com/repos/simonw/sqlite-utils/issues/50 | IC_kwDOCGYnMM5NtEcF | chapmanjacobd 7908073 | 2022-11-04T14:38:36Z | 2022-11-04T14:38:36Z | CONTRIBUTOR | where did you see the limit as 999? I believe the limit has been 32766 for quite some time. If you could detect which one this could speed up batch insert of some types of data significantly |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
"Too many SQL variables" on large inserts 473083260 | |
1303301786 | https://github.com/simonw/datasette/issues/1217#issuecomment-1303301786 | https://api.github.com/repos/simonw/datasette/issues/1217 | IC_kwDOBm6k_c5Nrs6a | mattmalcher 31312775 | 2022-11-04T11:37:52Z | 2022-11-04T11:37:52Z | NONE | All seems to work well, but there are some glitches to do with proxies, see #1883 . Excited to use this :) |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Possible to deploy as a python app (for Rstudio connect server)? 802513359 | |
1303299509 | https://github.com/simonw/datasette/issues/1217#issuecomment-1303299509 | https://api.github.com/repos/simonw/datasette/issues/1217 | IC_kwDOBm6k_c5NrsW1 | mattmalcher 31312775 | 2022-11-04T11:35:13Z | 2022-11-04T11:35:13Z | NONE | The following worked for deployment to RStudio / Posit Connect An app.py along the lines of: ```python from pathlib import Path from datasette.app import Datasette example_db = Path(file).parent / "data" / "example.db" use connect 'Content URL' setting here to set app to /datasette/ds = Datasette(files=[example_db], settings={"base_url": "/datasette/"}) ds._startup_invoked = True
ds_app = ds.app()
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Possible to deploy as a python app (for Rstudio connect server)? 802513359 | |
1302818153 | https://github.com/simonw/datasette/issues/1882#issuecomment-1302818153 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5Np21p | simonw 9599 | 2022-11-04T00:23:58Z | 2022-11-04T00:23:58Z | OWNER | I made a decision here that this endpoint should also accept an optional |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1302817807 | https://github.com/simonw/datasette/issues/1862#issuecomment-1302817807 | https://api.github.com/repos/simonw/datasette/issues/1862 | IC_kwDOBm6k_c5Np2wP | simonw 9599 | 2022-11-04T00:23:13Z | 2022-11-04T00:23:13Z | OWNER | I don't like this on |
{ "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 | |
1302817500 | https://github.com/simonw/datasette/issues/1862#issuecomment-1302817500 | https://api.github.com/repos/simonw/datasette/issues/1862 | IC_kwDOBm6k_c5Np2rc | simonw 9599 | 2022-11-04T00:22:31Z | 2022-11-04T00:22:31Z | OWNER | Maybe this is a feature added to the existing Bit weird that you can call that endpoint for a table that doesn't exist yet, but it fits the So perhaps the API looks like this:
That means I probably also need a |
{ "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 | |
1302815105 | https://github.com/simonw/datasette/issues/1871#issuecomment-1302815105 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5Np2GB | simonw 9599 | 2022-11-04T00:17:23Z | 2022-11-04T00:17:23Z | OWNER | I'll probably enhance it a bit more though, I want to provide a UI that lists all the tables you can explore and lets you click to pre-fill the forms with them. Though at that point what should I do about the other endpoints? Probably list those too. Gets a bit complex, especially with the row-level update and delete endpoints. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1302814693 | https://github.com/simonw/datasette/issues/1871#issuecomment-1302814693 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5Np1_l | simonw 9599 | 2022-11-04T00:16:36Z | 2022-11-04T00:16:36Z | OWNER | I can close this issue once I fix it so it no longer hard-codes a potentially invalid example endpoint: |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1302813449 | https://github.com/simonw/datasette/issues/1881#issuecomment-1302813449 | https://api.github.com/repos/simonw/datasette/issues/1881 | IC_kwDOBm6k_c5Np1sJ | simonw 9599 | 2022-11-04T00:14:07Z | 2022-11-04T00:14:07Z | OWNER | Tool is now live here: https://latest-1-0-dev.datasette.io/-/permissions Needs root perms, so access this first: https://latest-1-0-dev.datasette.io/login-as-root |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Tool for simulating permission checks against actors 1434094365 | |
1302812918 | https://github.com/simonw/datasette/issues/1881#issuecomment-1302812918 | https://api.github.com/repos/simonw/datasette/issues/1881 | IC_kwDOBm6k_c5Np1j2 | simonw 9599 | 2022-11-04T00:13:05Z | 2022-11-04T00:13:05Z | OWNER | Has tests now. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Tool for simulating permission checks against actors 1434094365 | |
1302790013 | https://github.com/simonw/datasette/issues/1863#issuecomment-1302790013 | https://api.github.com/repos/simonw/datasette/issues/1863 | IC_kwDOBm6k_c5Npv99 | simonw 9599 | 2022-11-03T23:32:30Z | 2022-11-03T23:32:30Z | OWNER | I'm not going to allow updates to primary keys. If you need to do that, you can instead delete the record and then insert a new one with the new primary keys you wanted - or maybe use a custom SQL query. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Update a single record in an existing table 1425029242 | |
1294224185 | https://github.com/simonw/datasette/issues/1851#issuecomment-1294224185 | https://api.github.com/repos/simonw/datasette/issues/1851 | IC_kwDOBm6k_c5NJEs5 | simonw 9599 | 2022-10-27T23:18:24Z | 2022-11-03T23:26:05Z | OWNER | So new API design is:
|
{ "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 | |
1302785086 | https://github.com/simonw/datasette/issues/1863#issuecomment-1302785086 | https://api.github.com/repos/simonw/datasette/issues/1863 | IC_kwDOBm6k_c5Npuw- | simonw 9599 | 2022-11-03T23:24:33Z | 2022-11-03T23:24:56Z | OWNER | Thinking more about validation: I'm considering if this should validate that columns which are defined as SQLite foreign keys are being updated to values that exist in those other tables. I like the sound of this. It seems like a sensible default behaviour for Datasette. And it fits with the fact that Datasette treats foreign keys specially elsewhere in the interface. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Update a single record in an existing table 1425029242 | |
1302760549 | https://github.com/simonw/datasette/issues/1863#issuecomment-1302760549 | https://api.github.com/repos/simonw/datasette/issues/1863 | IC_kwDOBm6k_c5Npoxl | simonw 9599 | 2022-11-03T22:43:04Z | 2022-11-03T23:21:31Z | OWNER | The
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Update a single record in an existing table 1425029242 | |
1302760382 | https://github.com/simonw/datasette/issues/1863#issuecomment-1302760382 | https://api.github.com/repos/simonw/datasette/issues/1863 | IC_kwDOBm6k_c5Npou- | simonw 9599 | 2022-11-03T22:42:47Z | 2022-11-03T22:42:47Z | OWNER |
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Update a single record in an existing table 1425029242 | |
1302759174 | https://github.com/simonw/datasette/issues/1863#issuecomment-1302759174 | https://api.github.com/repos/simonw/datasette/issues/1863 | IC_kwDOBm6k_c5NpocG | simonw 9599 | 2022-11-03T22:40:47Z | 2022-11-03T22:40:47Z | OWNER | I'm considering Pydantic for this, see: - https://github.com/simonw/datasette/issues/1882#issuecomment-1302716350 In particular the This would give me good validation. It would also, weirdly, give me the ability to output JSON schema. Maybe I could have this as the JSON schema for a row?
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Update a single record in an existing table 1425029242 | |
1302716350 | https://github.com/simonw/datasette/issues/1882#issuecomment-1302716350 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5Npd-- | simonw 9599 | 2022-11-03T21:51:14Z | 2022-11-03T22:35:54Z | OWNER | Validating this JSON object is getting a tiny bit complex. I'm tempted to adopt https://pydantic-docs.helpmanual.io/ at this point. The
```python from pydantic import create_model d = {"strategy": {"name": "test_strat2", "periods": 10}} Strategy = create_model("Strategy", **d["strategy"]) print(Strategy.schema_json(indent=2))
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1302721916 | https://github.com/simonw/datasette/issues/1882#issuecomment-1302721916 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5NpfV8 | simonw 9599 | 2022-11-03T21:58:50Z | 2022-11-03T21:59:17Z | OWNER | Mocked up a quick HTML+JavaScript form for creating that JSON structure using some iteration against Copilot prompts: ```html /* JSON format: { "table": { "name": "my new table", "columns": [ { "name": "id", "type": "integer" }, { "name": "title", "type": "text" } ] "pk": "id" } } HTML form with Javascript for creating this JSON: */<form id="create-table-form"> <label for="table-name">Table name</label> <label for="table-pk">Primary key</label> <label for="column-name">Column name</label> <label for="column-type">Column type</label> <button type="button" id="add-column">Add column</button> Current columns: ``` |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1302715662 | https://github.com/simonw/datasette/issues/1882#issuecomment-1302715662 | https://api.github.com/repos/simonw/datasette/issues/1882 | IC_kwDOBm6k_c5Npd0O | simonw 9599 | 2022-11-03T21:50:27Z | 2022-11-03T21:50:27Z | OWNER | API design for this:
This matches my design for |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
`/db/-/create` API for creating tables 1435294468 | |
1302679026 | https://github.com/simonw/datasette/issues/1843#issuecomment-1302679026 | https://api.github.com/repos/simonw/datasette/issues/1843 | IC_kwDOBm6k_c5NpU3y | simonw 9599 | 2022-11-03T21:22:42Z | 2022-11-03T21:22:42Z | OWNER | Docs for the new |
{ "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 | |
1302678384 | https://github.com/simonw/datasette/issues/1843#issuecomment-1302678384 | https://api.github.com/repos/simonw/datasette/issues/1843 | IC_kwDOBm6k_c5NpUtw | simonw 9599 | 2022-11-03T21:21:59Z | 2022-11-03T21:21:59Z | OWNER | I added extra debug info to
|
{ "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 | |
1302634332 | https://github.com/simonw/datasette/issues/1843#issuecomment-1302634332 | https://api.github.com/repos/simonw/datasette/issues/1843 | IC_kwDOBm6k_c5NpJ9c | simonw 9599 | 2022-11-03T20:34:56Z | 2022-11-03T20:34:56Z | OWNER | Confirmed that calling I'm adding a |
{ "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 | |
1302574330 | https://github.com/simonw/datasette/issues/1843#issuecomment-1302574330 | https://api.github.com/repos/simonw/datasette/issues/1843 | IC_kwDOBm6k_c5No7T6 | simonw 9599 | 2022-11-03T19:30:22Z | 2022-11-03T19:30:22Z | OWNER | This is affecting me a lot at the moment, on my laptop (runs fine in CI). Here's a change to
``` tests/test_api.py ............E
item = <Function test_sql_time_limit>
/Users/simon/Dropbox/Development/datasette/tests/conftest.py:200: AssertionError
Which uses this fixture: Which calls this function: So now I'm suspicious that, even though the fixture is meant to be session scoped, the way I'm using |
{ "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 | |
1301646670 | https://github.com/simonw/datasette/issues/1855#issuecomment-1301646670 | https://api.github.com/repos/simonw/datasette/issues/1855 | IC_kwDOBm6k_c5NlY1O | simonw 9599 | 2022-11-03T05:11:26Z | 2022-11-03T05:11:26Z | OWNER | That still needs comprehensive tests before I land it. |
{ "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 | |
1301646493 | https://github.com/simonw/datasette/issues/1855#issuecomment-1301646493 | https://api.github.com/repos/simonw/datasette/issues/1855 | IC_kwDOBm6k_c5NlYyd | simonw 9599 | 2022-11-03T05:11:06Z | 2022-11-03T05:11:06Z | OWNER | Built a prototype of the above: ```diff diff --git a/datasette/default_permissions.py b/datasette/default_permissions.py index 32b0c758..f68aa38f 100644 --- a/datasette/default_permissions.py +++ b/datasette/default_permissions.py @@ -6,8 +6,8 @@ import json import time -@hookimpl(tryfirst=True) -def permission_allowed(datasette, actor, action, resource): +@hookimpl(tryfirst=True, specname="permission_allowed") +def permission_allowed_default(datasette, actor, action, resource): async def inner(): if action in ( "permissions-debug", @@ -57,6 +57,44 @@ def permission_allowed(datasette, actor, action, resource): return inner +@hookimpl(specname="permission_allowed") +def permission_allowed_actor_restrictions(actor, action, resource): + if actor is None: + return None + r = actor.get("_r") + if not _r: + # No restrictions, so we have no opinion + return None + action_initials = "".join([word[0] for word in action.split("-")]) + # If _r is defined then we use those to further restrict the actor + # Crucially, we only use this to say NO (return False) - we never + # use it to return YES (True) because that might over-ride other + # restrictions placed on this actor + all_allowed = _r.get("a") + if all_allowed is not None: + assert isinstance(all_allowed, list) + if action_initials in all_allowed: + return None + # How about for the current database? + if action in ("view-database", "view-database-download", "execute-sql"): + database_allowed = _r.get("d", {}).get(resource) + if database_allowed is not None: + assert isinstance(database_allowed, list) + if action_initials in database_allowed: + return None + # Or the current table? That's any time the resource is (database, table) + if not isinstance(resource, str) and len(resource) == 2: + database, table = resource + table_allowed = _r.get("t", {}).get(database, {}).get(table) + # TODO: What should this do for canned queries? + if table_allowed is not None: + assert isinstance(table_allowed, list) + if action_initials in table_allowed: + return None + # This action is not specifically allowed, so reject it + return False + + @hookimpl def actor_from_request(datasette, request): prefix = "dstok" ``` |
{ "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 | |
1301639741 | https://github.com/simonw/datasette/issues/1881#issuecomment-1301639741 | https://api.github.com/repos/simonw/datasette/issues/1881 | IC_kwDOBm6k_c5NlXI9 | simonw 9599 | 2022-11-03T04:58:21Z | 2022-11-03T04:58:21Z | OWNER | The whole |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Tool for simulating permission checks against actors 1434094365 | |
1301639370 | https://github.com/simonw/datasette/issues/1881#issuecomment-1301639370 | https://api.github.com/repos/simonw/datasette/issues/1881 | IC_kwDOBm6k_c5NlXDK | simonw 9599 | 2022-11-03T04:57:21Z | 2022-11-03T04:57:21Z | OWNER | The plugin hook would be called |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Tool for simulating permission checks against actors 1434094365 | |
1301638918 | https://github.com/simonw/datasette/issues/1881#issuecomment-1301638918 | https://api.github.com/repos/simonw/datasette/issues/1881 | IC_kwDOBm6k_c5NlW8G | simonw 9599 | 2022-11-03T04:56:06Z | 2022-11-03T04:56:06Z | OWNER | I've also introduced a new concept of a permission abbreviation, which like the permission name needs to be globally unique. That's a problem for plugins - they might just be able to guarantee that their permission long-form name is unique among other plugins (through sensible naming conventions) but the thing where they declare a initial-letters-only abbreviation is far more risky. I think abbreviations are optional - they are provided for core permissions but plugins are advised not to use them. Also Datasette could check that the installed plugins do not provide conflicting permissions on startup and refuse to start if they do. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Tool for simulating permission checks against actors 1434094365 | |
1301638156 | https://github.com/simonw/datasette/issues/1881#issuecomment-1301638156 | https://api.github.com/repos/simonw/datasette/issues/1881 | IC_kwDOBm6k_c5NlWwM | simonw 9599 | 2022-11-03T04:54:00Z | 2022-11-03T04:54:00Z | OWNER | If I have the permissions defined like this:
On the other hand though, plugins that introduce their own permissions - like https://datasette.io/plugins/datasette-edit-schema - will need a way to register those permissions with Datasette core. Probably another plugin hook. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Tool for simulating permission checks against actors 1434094365 | |
1301635906 | https://github.com/simonw/datasette/issues/1881#issuecomment-1301635906 | https://api.github.com/repos/simonw/datasette/issues/1881 | IC_kwDOBm6k_c5NlWNC | simonw 9599 | 2022-11-03T04:48:09Z | 2022-11-03T04:48:09Z | OWNER | I built this prototype on the http://127.0.0.1:8001/-/allow-debug page, which is open to anyone to visit. But... I just realized that using this tool can leak information - you can use it to guess the names of invisible databases and tables and run theoretical permission checks against them. Using the tool also pollutes the list of permission checks that show up on the root-anlo So.... I'm going to restrict the usage of this tool to users with access to |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Tool for simulating permission checks against actors 1434094365 | |
1301635340 | https://github.com/simonw/datasette/issues/1881#issuecomment-1301635340 | https://api.github.com/repos/simonw/datasette/issues/1881 | IC_kwDOBm6k_c5NlWEM | simonw 9599 | 2022-11-03T04:46:41Z | 2022-11-03T04:46:41Z | OWNER | Built this prototype: In building it I realized I needed to know which permissions took a table, a database, both or neither. So I had to bake that into the code. Here's the prototype so far (which includes a prototype of the logic for the ```diff diff --git a/datasette/default_permissions.py b/datasette/default_permissions.py index 32b0c758..f68aa38f 100644 --- a/datasette/default_permissions.py +++ b/datasette/default_permissions.py @@ -6,8 +6,8 @@ import json import time -@hookimpl(tryfirst=True) -def permission_allowed(datasette, actor, action, resource): +@hookimpl(tryfirst=True, specname="permission_allowed") +def permission_allowed_default(datasette, actor, action, resource): async def inner(): if action in ( "permissions-debug", @@ -57,6 +57,44 @@ def permission_allowed(datasette, actor, action, resource): return inner +@hookimpl(specname="permission_allowed") +def permission_allowed_actor_restrictions(actor, action, resource): + if actor is None: + return None + r = actor.get("_r") + if not _r: + # No restrictions, so we have no opinion + return None + action_initials = "".join([word[0] for word in action.split("-")]) + # If _r is defined then we use those to further restrict the actor + # Crucially, we only use this to say NO (return False) - we never + # use it to return YES (True) because that might over-ride other + # restrictions placed on this actor + all_allowed = _r.get("a") + if all_allowed is not None: + assert isinstance(all_allowed, list) + if action_initials in all_allowed: + return None + # How about for the current database? + if action in ("view-database", "view-database-download", "execute-sql"): + database_allowed = _r.get("d", {}).get(resource) + if database_allowed is not None: + assert isinstance(database_allowed, list) + if action_initials in database_allowed: + return None + # Or the current table? That's any time the resource is (database, table) + if not isinstance(resource, str) and len(resource) == 2: + database, table = resource + table_allowed = _r.get("t", {}).get(database, {}).get(table) + # TODO: What should this do for canned queries? + if table_allowed is not None: + assert isinstance(table_allowed, list) + if action_initials in table_allowed: + return None + # This action is not specifically allowed, so reject it + return False + + @hookimpl def actor_from_request(datasette, request): prefix = "dstok" diff --git a/datasette/templates/allow_debug.html b/datasette/templates/allow_debug.html index 0f1b30f0..ae43f0f5 100644 --- a/datasette/templates/allow_debug.html +++ b/datasette/templates/allow_debug.html @@ -35,7 +35,7 @@ p.message-warning { Use this tool to try out different actor and allow combinations. See Defining permissions with "allow" blocks for documentation. -<form action="{{ urls.path('-/allow-debug') }}" method="get"> +<form action="{{ urls.path('-/allow-debug') }}" method="get" style="margin-bottom: 1em"> <label>Allow block</label> <textarea name="allow">{{ allow_input }}</textarea> @@ -55,4 +55,82 @@ p.message-warning {{% if result == "False" %} Result: deny {% endif %}+ Test permission check+ +This tool lets you simulate an actor and a permission check for that actor. + +<form action="{{ urls.path('-/allow-debug') }}" id="debug-post" method="post" style="margin-bottom: 1em"> + +
+
+ <label>Actor</label> + <textarea name="actor">{% if actor_input %}{{ actor_input }}{% else %}{"id": "root"}{% endif %}</textarea> +
+
+ <label>Permission check</label> +<label for="permission" style="display:block">Permission</label> + <select name="permission" id="permission"> + {% for permission in [ + "view-instance", + "view-database", + "view-database-download", + "view-table", + "view-query", + "insert-row", + "delete-row", + "drop-table", + "execute-sql", + "permissions-debug", + "debug-menu"] %} + <option value="{{ permission }}">{{ permission }}</option> + {% endfor %} + </select> + <label for="resource_1">Database name</label> +<label for="resource_2">Table or query name</label> +
+
+
+</form>
+
+<script>
+var rawPerms = {{ permissions|tojson }};
+var permissions = Object.fromEntries(rawPerms.map(([label, abbr, needs_resource_1, needs_resource_2, def]) => [label, {needs_resource_1, needs_resource_2, def}]))
+var permissionSelect = document.getElementById('permission');
+var resource1 = document.getElementById('resource_1');
+var resource2 = document.getElementById('resource_2');
+function updateResourceVisibility() {
+ var permission = permissionSelect.value;
+ var {needs_resource_1, needs_resource_2} = permissions[permission];
+ if (needs_resource_1) {
+ resource1.closest('p').style.display = 'block';
+ } else {
+ resource1.closest('p').style.display = 'none';
+ }
+ if (needs_resource_2) {
+ resource2.closest('p').style.display = 'block';
+ } else {
+ resource2.closest('p').style.display = 'none';
+ }
+}
+permissionSelect.addEventListener('change', updateResourceVisibility);
+updateResourceVisibility();
+
+// When #debug-post form is submitted, use fetch() to POST data
+var debugPost = document.getElementById('debug-post');
+debugPost.addEventListener('submit', function(ev) {
+ ev.preventDefault();
+ var formData = new FormData(debugPost);
+ console.log(formData);
+ fetch(debugPost.action, {
+ method: 'POST',
+ body: new URLSearchParams(formData),
+ }).then(function(response) {
+ return response.json();
+ }).then(function(data) {
+ alert(JSON.stringify(data, null, 4));
+ });
+});
+</script>
+ + {% endblock %} diff --git a/datasette/views/special.py b/datasette/views/special.py index 9922a621..d46fc280 100644 --- a/datasette/views/special.py +++ b/datasette/views/special.py @@ -1,6 +1,8 @@ import json +from datasette.permissions import PERMISSIONS from datasette.utils.asgi import Response, Forbidden from datasette.utils import actor_matches_allow, add_cors_headers +from datasette.permissions import PERMISSIONS from .base import BaseView import secrets import time @@ -138,9 +140,34 @@ class AllowDebugView(BaseView): "error": "\n\n".join(errors) if errors else "", "actor_input": actor_input, "allow_input": allow_input, + "permissions": PERMISSIONS, }, )
class MessagesDebugView(BaseView): name = "messages_debug" ``` |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Tool for simulating permission checks against actors 1434094365 | |
1301594495 | https://github.com/simonw/datasette/issues/1855#issuecomment-1301594495 | https://api.github.com/repos/simonw/datasette/issues/1855 | IC_kwDOBm6k_c5NlMF_ | simonw 9599 | 2022-11-03T03:11:17Z | 2022-11-03T03:11:17Z | OWNER | Maybe the way to do this is through a new standard mechanism on the actor: a set of additional restrictions, e.g.:
The way this works is there's a default permission_allowed(datasette, actor, action, resource) hook which only consults these, and crucially just says NO if those rules do not match. In this way it would apply as an extra layer of permission rules over the defaults (which for this |
{ "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 | |
1301043042 | https://github.com/simonw/datasette/issues/1880#issuecomment-1301043042 | https://api.github.com/repos/simonw/datasette/issues/1880 | IC_kwDOBm6k_c5NjFdi | amitkoth 525934 | 2022-11-02T18:20:14Z | 2022-11-02T18:20:14Z | NONE | Follow on question - is all memory use @simonw - for both datasette and SQLlite confined to the "query time" itself i.e. the memory use is relevant only to a particular transaction or query - and then subsequently released? |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Datasette with many and large databases > Memory use 1433576351 | |
1299607082 | https://github.com/simonw/datasette/issues/1871#issuecomment-1299607082 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5Ndm4q | simonw 9599 | 2022-11-02T05:45:31Z | 2022-11-02T05:45:31Z | OWNER | I'm going to add a link to the Datasette API docs for the current running version of Datasette, e.g. to https://docs.datasette.io/en/0.63/json_api.html |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1299600257 | https://github.com/simonw/datasette/issues/1871#issuecomment-1299600257 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5NdlOB | simonw 9599 | 2022-11-02T05:36:40Z | 2022-11-02T05:36:40Z | OWNER | The API Explorer should definitely link to the And it should probably go in the Datasette application menu? |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1299599461 | https://github.com/simonw/datasette/issues/1871#issuecomment-1299599461 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5NdlBl | simonw 9599 | 2022-11-02T05:35:36Z | 2022-11-02T05:36:15Z | OWNER | Here's a slightly wild idea: what if there was a button on Only reason I don't want to show these to everyone is that I don't think this is a very user-friendly feature: if you don't know what an API is I don't want to expose you to it unnecessarily. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1299598570 | https://github.com/simonw/datasette/issues/1871#issuecomment-1299598570 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5Ndkzq | simonw 9599 | 2022-11-02T05:34:28Z | 2022-11-02T05:34:28Z | OWNER | This is pretty useful now. Two features I still want to add:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1299597066 | https://github.com/simonw/datasette/issues/1871#issuecomment-1299597066 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5NdkcK | simonw 9599 | 2022-11-02T05:32:22Z | 2022-11-02T05:32:22Z | OWNER | Demo of the latest API explorer: |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1299388341 | https://github.com/simonw/datasette/issues/1871#issuecomment-1299388341 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5Ncxe1 | simonw 9599 | 2022-11-02T00:24:28Z | 2022-11-02T00:25:00Z | OWNER | I want JSON syntax highlighting. https://github.com/luyilin/json-format-highlight is an MIT licensed tiny highlighter that looks decent for this. https://unpkg.com/json-format-highlight@1.0.1/dist/json-format-highlight.js |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1299349741 | https://github.com/simonw/datasette/issues/1871#issuecomment-1299349741 | https://api.github.com/repos/simonw/datasette/issues/1871 | IC_kwDOBm6k_c5NcoDt | simonw 9599 | 2022-11-01T23:22:55Z | 2022-11-01T23:22:55Z | OWNER | It's weird that the API explorer only lets you explore POST APIs. It should probably also let you explore GET APIs, or be renamed. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
API explorer tool 1427293909 | |
1299098458 | https://github.com/simonw/datasette/issues/1879#issuecomment-1299098458 | https://api.github.com/repos/simonw/datasette/issues/1879 | IC_kwDOBm6k_c5Nbqta | simonw 9599 | 2022-11-01T20:27:40Z | 2022-11-01T20:33:52Z | OWNER | https://github.com/simonw/datasette-x-forwarded-host/blob/main/datasette_x_forwarded_host/init.py could happen in core controlled by:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Make it easier to fix URL proxy problems 1432037325 | |
1299102108 | https://github.com/simonw/datasette/issues/1879#issuecomment-1299102108 | https://api.github.com/repos/simonw/datasette/issues/1879 | IC_kwDOBm6k_c5Nbrmc | simonw 9599 | 2022-11-01T20:30:54Z | 2022-11-01T20:33:06Z | OWNER | One idea: add a |
{ "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Make it easier to fix URL proxy problems 1432037325 | |
1299102755 | https://github.com/simonw/datasette/issues/1879#issuecomment-1299102755 | https://api.github.com/repos/simonw/datasette/issues/1879 | IC_kwDOBm6k_c5Nbrwj | simonw 9599 | 2022-11-01T20:31:37Z | 2022-11-01T20:31:37Z | OWNER | And some JavaScript that can spot if Datasette thinks it is being served over HTTP when it's actually being served over HTTPS. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Make it easier to fix URL proxy problems 1432037325 | |
1299096850 | https://github.com/simonw/datasette/issues/1879#issuecomment-1299096850 | https://api.github.com/repos/simonw/datasette/issues/1879 | IC_kwDOBm6k_c5NbqUS | simonw 9599 | 2022-11-01T20:26:12Z | 2022-11-01T20:26:12Z | OWNER | The other relevant plugin here is https://datasette.io/plugins/datasette-x-forwarded-host Maybe that should be rolled into core too? |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Make it easier to fix URL proxy problems 1432037325 | |
1299090678 | https://github.com/simonw/datasette/issues/1879#issuecomment-1299090678 | https://api.github.com/repos/simonw/datasette/issues/1879 | IC_kwDOBm6k_c5Nboz2 | simonw 9599 | 2022-11-01T20:20:28Z | 2022-11-01T20:20:28Z | OWNER | My first step in debugging these is to install https://datasette.io/plugins/datasette-debug-asgi - but now I'm thinking maybe something like that should be part of core. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Make it easier to fix URL proxy problems 1432037325 | |
1299073433 | https://github.com/simonw/datasette/issues/1862#issuecomment-1299073433 | https://api.github.com/repos/simonw/datasette/issues/1862 | IC_kwDOBm6k_c5NbkmZ | simonw 9599 | 2022-11-01T20:04:31Z | 2022-11-01T20:04:31Z | OWNER | It really feels like this should be accompanied by a https://sqlite-utils.datasette.io/en/stable/cli.html#cli-create-table |
{ "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 |
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 >1000