github

Custom SQL query returning 101 rows (hide)

html_urlissue_urlidnode_idusercreated_atupdated_atauthor_associationbodyreactionsissueperformed_via_github_app
https://github.com/simonw/datasette/issues/1#issuecomment-338523957 https://api.github.com/repos/simonw/datasette/issues/1 338523957 MDEyOklzc3VlQ29tbWVudDMzODUyMzk1Nw== 9599 2017-10-23T01:09:05Z 2017-10-24T02:42:12Z OWNER I also need to solve for weird primary keys. If it’s a single integer or a single char field that’s easy. But what if it is a compound key with more than one chat field? What delimiter can I use that will definitely be safe? Let’s say I use hyphen. Now I need to find a durable encoding for any hyphens that might exist in the key fields themselves. How about I use URLencoding for every non-alpha-numeric character? That will turn hyphens into (I think) %2D. It should also solve for unicode characters, but it means the vast majority of keys (integers) will display neatly, including a compound key of eg 5678-345 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267513424  
https://github.com/simonw/datasette/issues/1#issuecomment-338524454 https://api.github.com/repos/simonw/datasette/issues/1 338524454 MDEyOklzc3VlQ29tbWVudDMzODUyNDQ1NA== 9599 2017-10-23T01:15:24Z 2017-10-23T01:15:24Z OWNER Table rendering logic needs to detect the primary key field and turn it into a hyperlink. If there is a compound primary key it should add an extra column at the start of the table which displays the compound key as a link {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267513424  
https://github.com/simonw/datasette/issues/5#issuecomment-338524857 https://api.github.com/repos/simonw/datasette/issues/5 338524857 MDEyOklzc3VlQ29tbWVudDMzODUyNDg1Nw== 9599 2017-10-23T01:20:30Z 2017-10-23T01:20:30Z OWNER https://stackoverflow.com/a/14468878/6083 Looks like I should order by compound primary key and implement cursor-based pagination. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267516066  
https://github.com/simonw/datasette/issues/3#issuecomment-338526148 https://api.github.com/repos/simonw/datasette/issues/3 338526148 MDEyOklzc3VlQ29tbWVudDMzODUyNjE0OA== 9599 2017-10-23T01:35:17Z 2017-10-23T01:35:17Z OWNER https://github.com/ahupp/python-magic/blob/master/README.md {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267515678  
https://github.com/simonw/datasette/issues/4#issuecomment-338530389 https://api.github.com/repos/simonw/datasette/issues/4 338530389 MDEyOklzc3VlQ29tbWVudDMzODUzMDM4OQ== 9599 2017-10-23T02:15:41Z 2017-10-23T02:15:41Z OWNER This means I need a good solution for these compile time options while running in development mode {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267515836  
https://github.com/simonw/datasette/issues/4#issuecomment-338530480 https://api.github.com/repos/simonw/datasette/issues/4 338530480 MDEyOklzc3VlQ29tbWVudDMzODUzMDQ4MA== 9599 2017-10-23T02:16:33Z 2017-10-23T02:16:33Z OWNER How about when the service starts up it checks for a compile.json file and, if it is missing, creates it using the same code we run at compile time normally {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267515836  
https://github.com/simonw/datasette/issues/11#issuecomment-338530704 https://api.github.com/repos/simonw/datasette/issues/11 338530704 MDEyOklzc3VlQ29tbWVudDMzODUzMDcwNA== 9599 2017-10-23T02:18:36Z 2017-10-23T02:18:36Z OWNER Needed by https://github.com/simonw/stateless-datasets/issues/4#issuecomment-338530389 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267522549  
https://github.com/simonw/datasette/issues/4#issuecomment-338531827 https://api.github.com/repos/simonw/datasette/issues/4 338531827 MDEyOklzc3VlQ29tbWVudDMzODUzMTgyNw== 9599 2017-10-23T02:28:31Z 2017-10-23T02:29:05Z OWNER Many of the applications I want to implement with this would benefit from having permanent real URLs. So let’s have both. The sha1 urls will serve far future cache headers (and an etag derived from their path). The non sha1 URLs will serve 302 uncached redirects to the sha1 locations. We will have a setting that lets people opt out of this behavior. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267515836  
https://github.com/simonw/datasette/issues/8#issuecomment-338697223 https://api.github.com/repos/simonw/datasette/issues/8 338697223 MDEyOklzc3VlQ29tbWVudDMzODY5NzIyMw== 9599 2017-10-23T15:28:11Z 2017-10-23T15:28:11Z OWNER Now returning this: { "error": "attempt to write a readonly database", "ok": false } {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267517314  
https://github.com/simonw/datasette/issues/16#issuecomment-338768860 https://api.github.com/repos/simonw/datasette/issues/16 338768860 MDEyOklzc3VlQ29tbWVudDMzODc2ODg2MA== 9599 2017-10-23T19:23:29Z 2017-10-23T19:23:29Z OWNER I could use the table-reflow mechanism demonstrated here: http://demos.jquerymobile.com/1.4.3/table-reflow/ {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267726219  
https://github.com/simonw/datasette/issues/20#issuecomment-338769538 https://api.github.com/repos/simonw/datasette/issues/20 338769538 MDEyOklzc3VlQ29tbWVudDMzODc2OTUzOA== 9599 2017-10-23T19:25:55Z 2017-10-23T19:25:55Z OWNER Maybe this should be handled by views instead? https://stateless-datasets-wreplxalgu.now.sh/ lists some views https://stateless-datasets-wreplxalgu.now.sh/?sql=select%20*%20from%20%22Order%20Subtotals%22 is an example showing the content of a view. What would the URL to views be? I don't think a view can share a name with a table, so the same URL scheme could work for both. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267759136  
https://github.com/simonw/datasette/issues/4#issuecomment-338789734 https://api.github.com/repos/simonw/datasette/issues/4 338789734 MDEyOklzc3VlQ29tbWVudDMzODc4OTczNA== 9599 2017-10-23T20:40:25Z 2017-10-23T21:10:19Z OWNER URL design: /database/table.json - redirects to /database-6753f4a/table.json So we always redirect to the version with the truncated hash in the URL. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267515836  
https://github.com/simonw/datasette/issues/4#issuecomment-338797522 https://api.github.com/repos/simonw/datasette/issues/4 338797522 MDEyOklzc3VlQ29tbWVudDMzODc5NzUyMg== 9599 2017-10-23T21:09:33Z 2017-10-23T21:09:33Z OWNER https://stackoverflow.com/a/18134919/6083 is a good answer about how many characters of the hash are needed to be unique. I say we default to 7 characters, like git does - but allow extras to be configured. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267515836  
https://github.com/simonw/datasette/issues/4#issuecomment-338799438 https://api.github.com/repos/simonw/datasette/issues/4 338799438 MDEyOklzc3VlQ29tbWVudDMzODc5OTQzOA== 9599 2017-10-23T21:17:25Z 2017-10-23T21:17:25Z OWNER Can I take advantage of HTTP/2 so even if you get redirected I start serving you the correct resource straight away? {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267515836  
https://github.com/simonw/datasette/issues/4#issuecomment-338804173 https://api.github.com/repos/simonw/datasette/issues/4 338804173 MDEyOklzc3VlQ29tbWVudDMzODgwNDE3Mw== 9599 2017-10-23T21:36:37Z 2017-10-23T21:36:37Z OWNER Looks like the easiest way to implement HTTP/2 server push today is to run behind Cloudflare and use this: Link: </asset/to/push.js>; rel=preload; as=script https://blog.cloudflare.com/announcing-support-for-http-2-server-push-2/ Here's the W3C draft: https://w3c.github.io/preload/ From https://w3c.github.io/preload/#as-attribute it looks like I should use `as=fetch` if the content is intended for consumption by fetch() or XMLHTTPRequest. Unclear if I should throw `as=fetch crossorigin` in there. Need to experiment on that. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267515836  
https://github.com/simonw/datasette/issues/4#issuecomment-338806718 https://api.github.com/repos/simonw/datasette/issues/4 338806718 MDEyOklzc3VlQ29tbWVudDMzODgwNjcxOA== 9599 2017-10-23T21:47:53Z 2017-10-23T21:47:53Z OWNER Here's what the homepage of cloudflare.com does (with newlines added within the link header for clarity): $ curl -i 'https://www.cloudflare.com/' HTTP/1.1 200 OK Date: Mon, 23 Oct 2017 21:45:58 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive link: </vendor/bitdashplayer.min.css>; rel=preload; as=style, </vendor/bitdash-controls.min.css>; rel=preload; as=style, </video/marketing-video/cloudflare-marketing-video.mpd>; rel=preload, </video/marketing-video/cloudflare-marketing-video.m3u8>; rel=preload, </video/marketing-video/video_0_800000/dash/init.mp4>; rel=preload; as=video, </video/marketing-video/audio_0_128000/dash/init.mp4>; rel=preload; as=video, </video/marketing-video/video_0_800000/dash/segment_0.m4s>; rel=preload; as=video, </video/marketing-video/audio_0_128000/dash/segment_0.m4s>; rel=preload; as=video, </video/new-short-optimized-22.mp4>; rel=preload; as=video, </video/marketing-video/poster.jpg>; rel=preload; as=image The original header looked like this: link: </vendor/bitdashplayer.min.css>; rel=preload; as=style, </vendor/bitdash-controls.min.css>; rel=preload; as=style, </video/marketing-video/cloudflare-marketing-video.mpd>; rel=preload, </video/marketing-video/cloudflare-marketing-video.m3u8>; rel=preload, </video/marketing-video/video_0_800000/dash/init.mp4>; rel=preload; as=video, </video/marketing-video/audio_0_128000/dash/init.mp4>; rel=preload; as=video, </video/marketing-video/video_0_800000/dash/segment_0.m4s>; rel=preload; as=video, </video/marketing-video/audio_0_128000/dash/segment_0.m4s>; rel=preload; as=video, </video/new-short-optimized-22.mp4>; rel=preload; as=video, </video/marketing-video/poster.jpg>; rel=preload; as=image {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267515836  
https://github.com/simonw/datasette/issues/24#issuecomment-338834213 https://api.github.com/repos/simonw/datasette/issues/24 338834213 MDEyOklzc3VlQ29tbWVudDMzODgzNDIxMw== 9599 2017-10-24T00:23:05Z 2017-10-24T00:23:05Z OWNER If I can’t setect a primary key, I won’t provide a URL for those records {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267828746  
https://github.com/simonw/datasette/issues/17#issuecomment-338852971 https://api.github.com/repos/simonw/datasette/issues/17 338852971 MDEyOklzc3VlQ29tbWVudDMzODg1Mjk3MQ== 9599 2017-10-24T02:26:47Z 2017-10-24T02:26:47Z OWNER I'm not going to bother with this. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267732005  
https://github.com/simonw/datasette/issues/7#issuecomment-338853083 https://api.github.com/repos/simonw/datasette/issues/7 338853083 MDEyOklzc3VlQ29tbWVudDMzODg1MzA4Mw== 9599 2017-10-24T02:27:25Z 2017-10-24T02:27:25Z OWNER Fixed in 9d219140694551453bfa528e0624919eb065f9d6 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267516650  
https://github.com/simonw/datasette/issues/23#issuecomment-338854988 https://api.github.com/repos/simonw/datasette/issues/23 338854988 MDEyOklzc3VlQ29tbWVudDMzODg1NDk4OA== 9599 2017-10-24T02:40:12Z 2017-10-25T00:05:46Z OWNER /database-name/table-name?name__contains=simon&sort=id+desc Note that if there's a column called "sort" you can still do sort__exact=blah {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267788884  
https://github.com/simonw/datasette/issues/1#issuecomment-338857568 https://api.github.com/repos/simonw/datasette/issues/1 338857568 MDEyOklzc3VlQ29tbWVudDMzODg1NzU2OA== 9599 2017-10-24T02:57:12Z 2017-10-24T02:57:12Z OWNER I can find the primary keys using: PRAGMA table_info(myTable) {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267513424  
https://github.com/simonw/datasette/issues/23#issuecomment-338859620 https://api.github.com/repos/simonw/datasette/issues/23 338859620 MDEyOklzc3VlQ29tbWVudDMzODg1OTYyMA== 9599 2017-10-24T03:11:42Z 2017-10-24T03:11:42Z OWNER I’m going to implement everything in https://docs.djangoproject.com/en/1.11/ref/models/querysets/#field-lookups with the exception of range and the various date ones. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267788884  
https://github.com/simonw/datasette/issues/23#issuecomment-338859709 https://api.github.com/repos/simonw/datasette/issues/23 338859709 MDEyOklzc3VlQ29tbWVudDMzODg1OTcwOQ== 9599 2017-10-24T03:12:18Z 2017-10-24T03:12:42Z OWNER I’m going to need to write unit tests for this, is this depends on #9 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267788884  
https://github.com/simonw/datasette/issues/1#issuecomment-338861511 https://api.github.com/repos/simonw/datasette/issues/1 338861511 MDEyOklzc3VlQ29tbWVudDMzODg2MTUxMQ== 9599 2017-10-24T03:24:17Z 2017-10-24T03:24:17Z OWNER Some tables won't have primary keys, in which case I won't generate pages for individual records. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267513424  
https://github.com/simonw/datasette/issues/9#issuecomment-338863155 https://api.github.com/repos/simonw/datasette/issues/9 338863155 MDEyOklzc3VlQ29tbWVudDMzODg2MzE1NQ== 9599 2017-10-24T03:36:58Z 2017-10-24T03:36:58Z OWNER I’m going to use py.test and start with all tests in a single tests.py module {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267517348  
https://github.com/simonw/datasette/issues/1#issuecomment-338872286 https://api.github.com/repos/simonw/datasette/issues/1 338872286 MDEyOklzc3VlQ29tbWVudDMzODg3MjI4Ng== 9599 2017-10-24T04:46:06Z 2017-10-24T04:46:06Z OWNER I'm going to use `,` as the separator between elements of a compound primary key. If those elements themselves include a comma I will use `%2C` in its place. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267513424  
https://github.com/simonw/datasette/issues/9#issuecomment-338882110 https://api.github.com/repos/simonw/datasette/issues/9 338882110 MDEyOklzc3VlQ29tbWVudDMzODg4MjExMA== 9599 2017-10-24T05:55:33Z 2017-10-24T05:55:33Z OWNER Well, I've started it at least. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267517348  
https://github.com/simonw/datasette/issues/1#issuecomment-338882207 https://api.github.com/repos/simonw/datasette/issues/1 338882207 MDEyOklzc3VlQ29tbWVudDMzODg4MjIwNw== 9599 2017-10-24T05:56:04Z 2017-10-24T05:56:04Z OWNER Next step: generate links to these. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267513424  
https://github.com/simonw/datasette/issues/24#issuecomment-339003850 https://api.github.com/repos/simonw/datasette/issues/24 339003850 MDEyOklzc3VlQ29tbWVudDMzOTAwMzg1MA== 9599 2017-10-24T14:12:00Z 2017-10-24T14:12:00Z OWNER As of b46e370ee6126aa2fa85cf789a31da38aed98496 this is done. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267828746  
https://github.com/simonw/datasette/issues/29#issuecomment-339019873 https://api.github.com/repos/simonw/datasette/issues/29 339019873 MDEyOklzc3VlQ29tbWVudDMzOTAxOTg3Mw== 9599 2017-10-24T14:58:33Z 2017-10-24T14:58:33Z OWNER Here's what I've got now: <img width="693" alt="localhost_8006_northwind-40d049b_categories_json" src="https://user-images.githubusercontent.com/9599/31950748-1bc85f3e-b891-11e7-8205-d89da6129f4b.png"> {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268050821  
https://github.com/simonw/datasette/issues/5#issuecomment-339027711 https://api.github.com/repos/simonw/datasette/issues/5 339027711 MDEyOklzc3VlQ29tbWVudDMzOTAyNzcxMQ== 9599 2017-10-24T15:21:30Z 2017-10-24T15:21:30Z OWNER I have code to detect primary keys on tables... but what should I do for tables that lack primary keys? How should I even sort them? {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267516066  
https://github.com/simonw/datasette/issues/5#issuecomment-339028979 https://api.github.com/repos/simonw/datasette/issues/5 339028979 MDEyOklzc3VlQ29tbWVudDMzOTAyODk3OQ== 9599 2017-10-24T15:25:08Z 2017-10-24T15:25:08Z OWNER Looks like I can use the SQLite specific “rowid” in that case. It isn’t guaranteed to stay consistent across a VACUUM but that’s ok because we are immutable anyway. https://www.sqlite.org/lang_createtable.html#rowid {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267516066  
https://github.com/simonw/datasette/issues/23#issuecomment-339138809 https://api.github.com/repos/simonw/datasette/issues/23 339138809 MDEyOklzc3VlQ29tbWVudDMzOTEzODgwOQ== 9599 2017-10-24T21:32:46Z 2017-10-24T21:32:46Z OWNER May as well support most of https://sqlite.org/lang_expr.html {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267788884  
https://github.com/simonw/datasette/issues/23#issuecomment-339186887 https://api.github.com/repos/simonw/datasette/issues/23 339186887 MDEyOklzc3VlQ29tbWVudDMzOTE4Njg4Nw== 9599 2017-10-25T01:39:43Z 2017-10-25T04:22:41Z OWNER Still to do: - [x] `gt`, `gte`, `lt`, `lte` - [x] `like` - [x] `glob` {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267788884  
https://github.com/simonw/datasette/issues/23#issuecomment-339210353 https://api.github.com/repos/simonw/datasette/issues/23 339210353 MDEyOklzc3VlQ29tbWVudDMzOTIxMDM1Mw== 9599 2017-10-25T04:23:02Z 2017-10-25T04:23:02Z OWNER I'm going to call this one done for the moment. The date filters can go in a stretch goal. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267788884  
https://github.com/simonw/datasette/issues/19#issuecomment-339366612 https://api.github.com/repos/simonw/datasette/issues/19 339366612 MDEyOklzc3VlQ29tbWVudDMzOTM2NjYxMg== 9599 2017-10-25T15:21:16Z 2017-10-25T15:21:16Z OWNER I had to manually set the content disposition header: return await response.file_stream( filepath, headers={ 'Content-Disposition': 'attachment; filename="{}"'.format(ilepath) } ) In the next release of Sanic I can just use the filename= argument instead: https://github.com/channelcat/sanic/commit/07e95dba4f5983afc1e673df14bdd278817288aa {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267741262  
https://github.com/simonw/datasette/issues/37#issuecomment-339382054 https://api.github.com/repos/simonw/datasette/issues/37 339382054 MDEyOklzc3VlQ29tbWVudDMzOTM4MjA1NA== 9599 2017-10-25T16:05:56Z 2017-10-25T16:05:56Z OWNER Could this be as simple as using the iterative JSON encoder and adding a yield statement in between each chunk? {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268453968  
https://github.com/simonw/datasette/issues/38#issuecomment-339388215 https://api.github.com/repos/simonw/datasette/issues/38 339388215 MDEyOklzc3VlQ29tbWVudDMzOTM4ODIxNQ== 9599 2017-10-25T16:25:45Z 2017-10-25T16:25:45Z OWNER First experiment: hook up an iterative CSV dump (just because that’s a tiny bit easier to get started with than iterative a JSON). Have it execute a big select statement and then iterate through the result set 100 rows at a time using sqite fetchmany() - also have it async sleep for a second in between each batch of 100. Can this work without needing python threads? {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268462768  
https://github.com/simonw/datasette/issues/38#issuecomment-339388771 https://api.github.com/repos/simonw/datasette/issues/38 339388771 MDEyOklzc3VlQ29tbWVudDMzOTM4ODc3MQ== 9599 2017-10-25T16:27:29Z 2017-10-25T16:27:29Z OWNER If this does work, I need to figure it what to do about the HTML view. ASsuming I can iteratively produce JSON and CSV, what to do about HTML? One option: render the first 500 rows as HTML, then hand off to an infinite scroll experience that iteratively loads more rows as JSON. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268462768  
https://github.com/simonw/datasette/issues/38#issuecomment-339389105 https://api.github.com/repos/simonw/datasette/issues/38 339389105 MDEyOklzc3VlQ29tbWVudDMzOTM4OTEwNQ== 9599 2017-10-25T16:28:39Z 2017-10-25T16:28:39Z OWNER The gold standard here is to be able to serve up increasingly large datasets without blocking the event loop and while using a sustainable amount of RAM {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268462768  
https://github.com/simonw/datasette/issues/38#issuecomment-339389328 https://api.github.com/repos/simonw/datasette/issues/38 339389328 MDEyOklzc3VlQ29tbWVudDMzOTM4OTMyOA== 9599 2017-10-25T16:29:23Z 2017-10-25T16:29:23Z OWNER Ideally we can get some serious gains from the fact that our database file is opened with the immutable option. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268462768  
https://github.com/simonw/datasette/issues/40#issuecomment-339395551 https://api.github.com/repos/simonw/datasette/issues/40 339395551 MDEyOklzc3VlQ29tbWVudDMzOTM5NTU1MQ== 9599 2017-10-25T16:49:32Z 2017-10-25T16:49:32Z OWNER Simplest implementation will be to create a temporary directory somewhere, copy in a Dockerfile and the databases and run “now” in it. Ideally I can use symlinks rather than copying potentially large database files around. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/39#issuecomment-339406634 https://api.github.com/repos/simonw/datasette/issues/39 339406634 MDEyOklzc3VlQ29tbWVudDMzOTQwNjYzNA== 9599 2017-10-25T17:27:10Z 2017-10-25T17:27:10Z OWNER It certainly looks like some of the stuff in https://sqlite.org/pragma.html could be used to screw around with things. Example: `PRAGMA case_sensitive_like = 1` - would that affect future queries? {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268469569  
https://github.com/simonw/datasette/issues/39#issuecomment-339413825 https://api.github.com/repos/simonw/datasette/issues/39 339413825 MDEyOklzc3VlQ29tbWVudDMzOTQxMzgyNQ== 9599 2017-10-25T17:48:48Z 2017-10-25T17:48:48Z OWNER Could I use https://sqlparse.readthedocs.io/en/latest/ to parse incoming statements and ensure they are pure SELECTs? Would that prevent people from using a compound SELECT statement to trigger an evil PRAGMA of some sort? {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268469569  
https://github.com/simonw/datasette/issues/16#issuecomment-339420462 https://api.github.com/repos/simonw/datasette/issues/16 339420462 MDEyOklzc3VlQ29tbWVudDMzOTQyMDQ2Mg== 9599 2017-10-25T18:10:51Z 2017-10-25T18:10:51Z OWNER https://sitesforprofit.com/responsive-table-plugins-and-patterns has some useful links. I really like the pattern from https://css-tricks.com/responsive-data-tables/ /* Max width before this PARTICULAR table gets nasty This query will take effect for any screen smaller than 760px and also iPads specifically. */ @media only screen and (max-width: 760px), (min-device-width: 768px) and (max-device-width: 1024px) { /* Force table to not be like tables anymore */ table, thead, tbody, th, td, tr { display: block; } /* Hide table headers (but not display: none;, for accessibility) */ thead tr { position: absolute; top: -9999px; left: -9999px; } tr { border: 1px solid #ccc; } td { /* Behave like a "row" */ border: none; border-bottom: 1px solid #eee; position: relative; padding-left: 50%; } td:before { /* Now like a table header */ position: absolute; /* Top/left values mimic padding */ top: 6px; left: 6px; width: 45%; padding-right: 10px; white-space: nowrap; } /* Label the data */ td:nth-of-type(1):before { content: "First Name"; } td:nth-of-type(2):before { content: "Last Name"; } td:nth-of-type(3):before { content: "Job Title"; } td:nth-of-type(4):before { content: "Favorite Color"; } td:nth-of-type(5):before { content: "Wars of Trek?"; } td:nth-of-type(6):before { content: "Porn Name"; } td:nth-of-type(7):before { content: "Date of Birth"; } td:nth-of-type(8):before { content: "Dream Vacation City"; } td:nth-of-type(9):before { content: "GPA"; } td:nth-of-type(10):before { content: "Arbitrary Data"; } } {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267726219  
https://github.com/simonw/datasette/issues/39#issuecomment-339510770 https://api.github.com/repos/simonw/datasette/issues/39 339510770 MDEyOklzc3VlQ29tbWVudDMzOTUxMDc3MA== 9599 2017-10-26T00:07:40Z 2017-10-26T00:07:40Z OWNER It looks like I should double quote my columns and ensure they are correctly escaped https://blog.christosoft.de/2012/10/sqlite-escaping-table-acolumn-names/ - hopefully using ? placeholders for column names will work. I should use ? for tables too. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268469569  
https://github.com/simonw/datasette/issues/40#issuecomment-339514819 https://api.github.com/repos/simonw/datasette/issues/40 339514819 MDEyOklzc3VlQ29tbWVudDMzOTUxNDgxOQ== 9599 2017-10-26T00:35:46Z 2017-10-26T00:35:46Z OWNER I’m going to have a single command-line app that does everything. Name to be decided - options include dataset, stateless, datasite (I quite like that - it reflects SQLite and the fact that you create a website) {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/40#issuecomment-339515822 https://api.github.com/repos/simonw/datasette/issues/40 339515822 MDEyOklzc3VlQ29tbWVudDMzOTUxNTgyMg== 9599 2017-10-26T00:43:34Z 2017-10-26T00:43:34Z OWNER datasite . - starts web app in current directory, serving all DB files datasite . -p 8001 - serves on custom port datasite blah.db blah2.db - serves specified files You can’t specify more than one directory. You can specify as many files as you like. If you specify two files with different oaths but the same name then they must be accessed by hash. datasite publish . - publishes current directory to the internet! Uses now by default, if it detects it on your path. Other publishers will be eventually added as plugins. datasite publish http://path-to-db.db - publishes a DB available at a URL. Works by constructing the Dockerfile with wget calls in it. datasite blah.db -m metadata.json If you specify a directory it looks for metadata.json in that directory. Otherwise you can pass an explicit metadata file oath with -m or —metadata {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/40#issuecomment-339516032 https://api.github.com/repos/simonw/datasette/issues/40 339516032 MDEyOklzc3VlQ29tbWVudDMzOTUxNjAzMg== 9599 2017-10-26T00:44:52Z 2017-10-26T00:44:52Z OWNER Another potential name: datapi {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/40#issuecomment-339517846 https://api.github.com/repos/simonw/datasette/issues/40 339517846 MDEyOklzc3VlQ29tbWVudDMzOTUxNzg0Ng== 9599 2017-10-26T00:58:39Z 2017-10-26T00:58:39Z OWNER I’m going to use Click for this http://nvie.com/posts/writing-a-cli-in-python-in-under-60-seconds/ https://kushaldas.in/posts/building-command-line-tools-in-python-with-click.html {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/40#issuecomment-339724700 https://api.github.com/repos/simonw/datasette/issues/40 339724700 MDEyOklzc3VlQ29tbWVudDMzOTcyNDcwMA== 9599 2017-10-26T16:35:20Z 2017-10-26T16:35:20Z OWNER Here’s how to make the “serve” subcommand the default if it is called with no arguments: @click.group(invoke_without_command=True) def serve(): # ... {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/41#issuecomment-339866724 https://api.github.com/repos/simonw/datasette/issues/41 339866724 MDEyOklzc3VlQ29tbWVudDMzOTg2NjcyNA== 9599 2017-10-27T04:04:52Z 2017-10-27T04:04:52Z OWNER <img width="624" alt="databases" src="https://user-images.githubusercontent.com/9599/32087550-4e10b8a4-ba91-11e7-992b-e628d77114d0.png"> {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268590777  
https://github.com/simonw/datasette/issues/40#issuecomment-339891755 https://api.github.com/repos/simonw/datasette/issues/40 339891755 MDEyOklzc3VlQ29tbWVudDMzOTg5MTc1NQ== 9599 2017-10-27T07:10:53Z 2017-10-27T07:10:53Z OWNER Deploys to Now aren't working at the moment - they aren't showing the uploaded databases, because I've broken the path handling somehow. I need to do a bit more work here. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/40#issuecomment-340561577 https://api.github.com/repos/simonw/datasette/issues/40 340561577 MDEyOklzc3VlQ29tbWVudDM0MDU2MTU3Nw== 9599 2017-10-30T19:43:40Z 2017-10-30T19:43:40Z OWNER http://the-hitchhikers-guide-to-packaging.readthedocs.io/en/latest/quickstart.html describes how to package this for PyPI {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/39#issuecomment-340787868 https://api.github.com/repos/simonw/datasette/issues/39 340787868 MDEyOklzc3VlQ29tbWVudDM0MDc4Nzg2OA== 9599 2017-10-31T14:54:14Z 2017-10-31T14:54:14Z OWNER Here’s how I can (I think) provide safe execution of arbitrary SQL while blocking PRAGMA calls: let people use names parameters in their SQL and apply strict filtering to the SQL query but not to the parameter values. cur.execute( "select * from people where name_last=:who and age=:age", { "who": who, "age": age }) In URL form: ?sql=select...&who=Terry&age=34 Now we can apply strict, dumb validation rules to the SQL part while allowing anything in the named queries - so people can execute a search for PRAGMA without being able to execute a PRAGMA statement. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268469569  
https://github.com/simonw/datasette/issues/10#issuecomment-341938424 https://api.github.com/repos/simonw/datasette/issues/10 341938424 MDEyOklzc3VlQ29tbWVudDM0MTkzODQyNA== 9599 2017-11-04T23:48:57Z 2017-11-04T23:48:57Z OWNER Done: https://github.com/simonw/stateless-datasets/commit/edaa10587e60946e0c1935333f6b79553db33798 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267517381  
https://github.com/simonw/datasette/issues/40#issuecomment-341945420 https://api.github.com/repos/simonw/datasette/issues/40 341945420 MDEyOklzc3VlQ29tbWVudDM0MTk0NTQyMA== 9599 2017-11-05T02:55:07Z 2017-11-05T02:55:07Z OWNER To simplify things a bit, I'm going to require that every database is explicitly listed in the command line. I won't support "serve everything in this directory" for the moment. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/40#issuecomment-342030075 https://api.github.com/repos/simonw/datasette/issues/40 342030075 MDEyOklzc3VlQ29tbWVudDM0MjAzMDA3NQ== 9599 2017-11-06T02:25:48Z 2017-11-06T02:25:48Z OWNER ... I tried that, I don't like it. I'm going to bring back "directory serving" by allowing you to pass a directory as an argument to `datasite` (including `datasite .`). I may even make `.` the default if you don't provide anything at all. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/16#issuecomment-342032943 https://api.github.com/repos/simonw/datasette/issues/16 342032943 MDEyOklzc3VlQ29tbWVudDM0MjAzMjk0Mw== 9599 2017-11-06T02:50:07Z 2017-11-06T02:50:07Z OWNER Default look with Bootstrap 4 looks like this: <img width="871" alt="flights" src="https://user-images.githubusercontent.com/9599/32423242-1b4458ce-c25a-11e7-910f-2dc1de909b8f.png"> {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267726219  
https://github.com/simonw/datasette/issues/44#issuecomment-342484889 https://api.github.com/repos/simonw/datasette/issues/44 342484889 MDEyOklzc3VlQ29tbWVudDM0MjQ4NDg4OQ== 9599 2017-11-07T13:39:49Z 2017-11-07T13:39:49Z OWNER I’m going to call this feature “count values” {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 269731374  
https://github.com/simonw/datasette/issues/47#issuecomment-342521344 https://api.github.com/repos/simonw/datasette/issues/47 342521344 MDEyOklzc3VlQ29tbWVudDM0MjUyMTM0NA== 9599 2017-11-07T15:37:45Z 2017-11-07T15:37:45Z OWNER GDS Registries could be fun too: https://registers.cloudapps.digital/ {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 271831408  
https://github.com/simonw/datasette/issues/32#issuecomment-343164111 https://api.github.com/repos/simonw/datasette/issues/32 343164111 MDEyOklzc3VlQ29tbWVudDM0MzE2NDExMQ== 9599 2017-11-09T14:05:56Z 2017-11-09T14:05:56Z OWNER Implemented in 31b21f5c5e15fc3acab7fabb170c1da71dc3c98c {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268106803  
https://github.com/simonw/datasette/issues/48#issuecomment-343168796 https://api.github.com/repos/simonw/datasette/issues/48 343168796 MDEyOklzc3VlQ29tbWVudDM0MzE2ODc5Ng== 9599 2017-11-09T14:22:21Z 2017-11-09T14:22:21Z OWNER Won't fix: ujson is not compatible with the custom JSON encoder I'm using here: https://github.com/simonw/immutabase/blob/b2dee11fcd989d9e2a7bf4de1e23dbc320c05013/immutabase/app.py#L401-L416 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 272391665  
https://github.com/simonw/datasette/issues/49#issuecomment-343237982 https://api.github.com/repos/simonw/datasette/issues/49 343237982 MDEyOklzc3VlQ29tbWVudDM0MzIzNzk4Mg== 9599 2017-11-09T17:58:01Z 2017-11-09T17:58:01Z OWNER More terms: * publish * share * docker * host * stateless I want to capture the idea of publishing an immutable database in a stateless container. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 272661336  
https://github.com/simonw/datasette/issues/49#issuecomment-343238262 https://api.github.com/repos/simonw/datasette/issues/49 343238262 MDEyOklzc3VlQ29tbWVudDM0MzIzODI2Mg== 9599 2017-11-09T17:58:59Z 2017-11-09T17:58:59Z OWNER The name should ideally be available on PyPI and should make sense as both a command line application and a library. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 272661336  
https://github.com/simonw/datasette/issues/48#issuecomment-343239062 https://api.github.com/repos/simonw/datasette/issues/48 343239062 MDEyOklzc3VlQ29tbWVudDM0MzIzOTA2Mg== 9599 2017-11-09T18:01:46Z 2017-11-09T18:01:46Z OWNER This looks promising: https://github.com/esnme/ultrajson/issues/124#issuecomment-323882878 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 272391665  
https://github.com/simonw/datasette/issues/50#issuecomment-343266326 https://api.github.com/repos/simonw/datasette/issues/50 343266326 MDEyOklzc3VlQ29tbWVudDM0MzI2NjMyNg== 9599 2017-11-09T19:33:18Z 2017-11-09T19:33:18Z OWNER http://sanic.readthedocs.io/en/latest/sanic/testing.html {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 272694136  
https://github.com/simonw/datasette/issues/49#issuecomment-343281876 https://api.github.com/repos/simonw/datasette/issues/49 343281876 MDEyOklzc3VlQ29tbWVudDM0MzI4MTg3Ng== 9599 2017-11-09T20:30:42Z 2017-11-09T20:30:42Z OWNER How about datasette? {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 272661336  
https://github.com/simonw/datasette/issues/49#issuecomment-343551356 https://api.github.com/repos/simonw/datasette/issues/49 343551356 MDEyOklzc3VlQ29tbWVudDM0MzU1MTM1Ng== 9599 2017-11-10T18:33:22Z 2017-11-10T18:33:22Z OWNER I'm going with datasette. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 272661336  
https://github.com/simonw/datasette/issues/52#issuecomment-343557070 https://api.github.com/repos/simonw/datasette/issues/52 343557070 MDEyOklzc3VlQ29tbWVudDM0MzU1NzA3MA== 9599 2017-11-10T18:57:47Z 2017-11-10T18:57:47Z OWNER https://file.io/ looks like it could be good for this. It's been around since 2015, and lets you upload a temporary file which can be downloaded once. $ curl -s -F "file=@database.db" "https://file.io/?expires=1d" {"success":true,"key":"ySrl1j","link":"https://file.io/ySrl1j","expiry":"1 day"} Downloading from that URL serves up the data with a `Content-disposition` header containing the filename: simonw$ curl -vv https://file.io/ySrl1j | more % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 34.232.1.167... * Connected to file.io (34.232.1.167) port 443 (#0) * TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * Server certificate: file.io * Server certificate: Amazon * Server certificate: Amazon Root CA 1 * Server certificate: Starfield Services Root Certificate Authority - G2 > GET /ySrl1j HTTP/1.1 > Host: file.io > User-Agent: curl/7.43.0 > Accept: */* > < HTTP/1.1 200 OK < Date: Fri, 10 Nov 2017 18:14:38 GMT < Content-Type: undefined < Transfer-Encoding: chunked < Connection: keep-alive < X-Powered-By: Express < X-RateLimit-Limit: 5 < X-RateLimit-Remaining: 4 < Access-Control-Allow-Origin: * < Access-Control-Allow-Headers: Cache-Control,X-reqed-With,x-requested-with < Content-disposition: attachment; filename=database.db ... {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273026602  
https://github.com/simonw/datasette/issues/20#issuecomment-343581130 https://api.github.com/repos/simonw/datasette/issues/20 343581130 MDEyOklzc3VlQ29tbWVudDM0MzU4MTEzMA== 9599 2017-11-10T20:44:38Z 2017-11-10T20:44:38Z OWNER I'm going to handle this a different way. I'm going to support a local history of your own queries stored in localStorage, but if you want to share a query you have to do it with a URL. If people really want canned query support, they can do that using custom templates - see #12 - or by adding views to their database before they publish it. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267759136  
https://github.com/simonw/datasette/issues/21#issuecomment-343581332 https://api.github.com/repos/simonw/datasette/issues/21 343581332 MDEyOklzc3VlQ29tbWVudDM0MzU4MTMzMg== 9599 2017-11-10T20:45:42Z 2017-11-10T20:45:42Z OWNER I'm not going to use Sanic's mechanism for this. I'll use arguments passed to my cli instead. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267769034  
https://github.com/simonw/datasette/issues/16#issuecomment-343643332 https://api.github.com/repos/simonw/datasette/issues/16 343643332 MDEyOklzc3VlQ29tbWVudDM0MzY0MzMzMg== 9599 2017-11-11T06:00:04Z 2017-11-11T06:00:04Z OWNER Here's what a table looks like now at a smaller screen size: <img width="496" alt="parlgov-development__info_data_source" src="https://user-images.githubusercontent.com/9599/32686818-7ffa691e-c662-11e7-964d-201fce0694e4.png"> {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267726219  
https://github.com/simonw/datasette/issues/54#issuecomment-343644891 https://api.github.com/repos/simonw/datasette/issues/54 343644891 MDEyOklzc3VlQ29tbWVudDM0MzY0NDg5MQ== 9599 2017-11-11T06:39:54Z 2017-11-11T06:39:54Z OWNER I can detect something is a view like this: SELECT name from sqlite_master WHERE type ='view'; {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273121803  
https://github.com/simonw/datasette/issues/26#issuecomment-343644976 https://api.github.com/repos/simonw/datasette/issues/26 343644976 MDEyOklzc3VlQ29tbWVudDM0MzY0NDk3Ng== 9599 2017-11-11T06:42:23Z 2017-11-11T06:42:23Z OWNER Simplest version of this: 1. Create a temporary directory 2. Write a Dockerfile into it that pulls an image and pip installs datasette 3. Add symlinks to the DBs they listed (so we don't have to copy them) 4. Shell out to "now" 5. Done! {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267861210  
https://github.com/simonw/datasette/issues/26#issuecomment-343645249 https://api.github.com/repos/simonw/datasette/issues/26 343645249 MDEyOklzc3VlQ29tbWVudDM0MzY0NTI0OQ== 9599 2017-11-11T06:48:59Z 2017-11-11T06:48:59Z OWNER Doing this works: import os os.link('/tmp/databases/northwind.db', '/tmp/tmp-blah/northwind.db') That creates a link in tmp-blah - and then when I delete that entire directory like so: import shutil shutil.rmtree('/tmp/tmp-blah') The original database is not deleted, just the link. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267861210  
https://github.com/simonw/datasette/issues/26#issuecomment-343645327 https://api.github.com/repos/simonw/datasette/issues/26 343645327 MDEyOklzc3VlQ29tbWVudDM0MzY0NTMyNw== 9599 2017-11-11T06:51:16Z 2017-11-11T06:51:16Z OWNER I can create the temporary directory like so: import tempfile t = tempfile.TemporaryDirectory() t <TemporaryDirectory '/var/folders/w9/0xm39tk94ng9h52g06z4b54c0000gp/T/tmpkym70wlp'> t.name '/var/folders/w9/0xm39tk94ng9h52g06z4b54c0000gp/T/tmpkym70wlp' And then to delete it all: t.cleanup() {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267861210  
https://github.com/simonw/datasette/issues/40#issuecomment-343646740 https://api.github.com/repos/simonw/datasette/issues/40 343646740 MDEyOklzc3VlQ29tbWVudDM0MzY0Njc0MA== 9599 2017-11-11T07:27:33Z 2017-11-11T07:27:33Z OWNER I'm happy with this now that I've implemented the publish command in #26 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268470572  
https://github.com/simonw/datasette/issues/47#issuecomment-343647102 https://api.github.com/repos/simonw/datasette/issues/47 343647102 MDEyOklzc3VlQ29tbWVudDM0MzY0NzEwMg== 9599 2017-11-11T07:36:00Z 2017-11-11T07:36:00Z OWNER http://2016.padjo.org/tutorials/data-primer-census-acs1-demographics/ has a sqlite database: http://2016.padjo.org/files/data/starterpack/census-acs-1year/acs-1-year-2015.sqlite I tested this by deploying it here: https://datasette-fewuggrvwr.now.sh/ {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 271831408  
https://github.com/simonw/datasette/issues/16#issuecomment-343647300 https://api.github.com/repos/simonw/datasette/issues/16 343647300 MDEyOklzc3VlQ29tbWVudDM0MzY0NzMwMA== 9599 2017-11-11T07:41:19Z 2017-11-11T07:53:09Z OWNER Still needed: - [ ] A link to the homepage from some kind of navigation bar in the header - [ ] link to github.com/simonw/datasette in the footer - [ ] Slightly better titles (maybe ditch the visited link colours for titles only? should keep those for primary key links) - [ ] Links to the .json and .jsono versions of every view {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267726219  
https://github.com/simonw/datasette/issues/14#issuecomment-343675165 https://api.github.com/repos/simonw/datasette/issues/14 343675165 MDEyOklzc3VlQ29tbWVudDM0MzY3NTE2NQ== 9599 2017-11-11T16:07:10Z 2017-11-11T16:07:10Z OWNER The plugin system can also allow alternative providers for the `publish` command - e.g. maybe hook up hyper.sh as an option for publishing containers. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267707940  
https://github.com/simonw/datasette/issues/59#issuecomment-343676574 https://api.github.com/repos/simonw/datasette/issues/59 343676574 MDEyOklzc3VlQ29tbWVudDM0MzY3NjU3NA== 9599 2017-11-11T16:29:48Z 2017-11-11T16:29:48Z OWNER See also #14 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273157085  
https://github.com/simonw/datasette/issues/60#issuecomment-343683566 https://api.github.com/repos/simonw/datasette/issues/60 343683566 MDEyOklzc3VlQ29tbWVudDM0MzY4MzU2Ng== 9599 2017-11-11T18:12:24Z 2017-11-11T18:12:24Z OWNER I’m going to solve this by making it an optional argument you can pass to the serve command. Then the Dockerfile can still build and use it but it won’t interfere with tests or dev. If argument is not passed, we will calculate hashes on startup and calculate table row counts on demand. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273163905  
https://github.com/simonw/datasette/issues/47#issuecomment-343690060 https://api.github.com/repos/simonw/datasette/issues/47 343690060 MDEyOklzc3VlQ29tbWVudDM0MzY5MDA2MA== 9599 2017-11-11T19:56:08Z 2017-11-11T19:56:08Z OWNER "parlgov-development.db": { "url": "http://www.parlgov.org/" }, "nhsadmin.sqlite": { "url": "https://github.com/psychemedia/openHealthDataDoodles" } {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 271831408  
https://github.com/simonw/datasette/issues/16#issuecomment-343691342 https://api.github.com/repos/simonw/datasette/issues/16 343691342 MDEyOklzc3VlQ29tbWVudDM0MzY5MTM0Mg== 9599 2017-11-11T20:19:07Z 2017-11-11T20:19:07Z OWNER Closing this, opening a fresh ticket for the navigation stuff. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267726219  
https://github.com/simonw/datasette/issues/63#issuecomment-343697291 https://api.github.com/repos/simonw/datasette/issues/63 343697291 MDEyOklzc3VlQ29tbWVudDM0MzY5NzI5MQ== 9599 2017-11-11T22:05:06Z 2017-11-11T22:11:49Z OWNER I'm going to bundle sql and sql_params together into a query nested object like this: { "query": { "sql": "select ...", "params": { "p0": "blah" } } } {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273174447  
https://github.com/simonw/datasette/issues/50#issuecomment-343698214 https://api.github.com/repos/simonw/datasette/issues/50 343698214 MDEyOklzc3VlQ29tbWVudDM0MzY5ODIxNA== 9599 2017-11-11T22:23:21Z 2017-11-11T22:23:21Z OWNER I'm closing #50 - more tests will be added in the future, but the framework is neatly in place for them now. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 272694136  
https://github.com/simonw/datasette/issues/53#issuecomment-343699115 https://api.github.com/repos/simonw/datasette/issues/53 343699115 MDEyOklzc3VlQ29tbWVudDM0MzY5OTExNQ== 9599 2017-11-11T22:41:38Z 2017-11-11T22:41:38Z OWNER This needs to incorporate a sensible way of presenting custom SQL query results too. And let's get a textarea in there for executing SQL while we're at it. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273054652  
https://github.com/simonw/datasette/issues/47#issuecomment-343705966 https://api.github.com/repos/simonw/datasette/issues/47 343705966 MDEyOklzc3VlQ29tbWVudDM0MzcwNTk2Ng== 9599 2017-11-12T01:00:20Z 2017-11-12T01:00:20Z OWNER https://github.com/fivethirtyeight/data has a ton of CSVs {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 271831408  
https://github.com/simonw/datasette/issues/53#issuecomment-343707624 https://api.github.com/repos/simonw/datasette/issues/53 343707624 MDEyOklzc3VlQ29tbWVudDM0MzcwNzYyNA== 9599 2017-11-12T01:47:45Z 2017-11-12T01:47:45Z OWNER Split the SQL thing out into #65 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273054652  
https://github.com/simonw/datasette/issues/53#issuecomment-343707676 https://api.github.com/repos/simonw/datasette/issues/53 343707676 MDEyOklzc3VlQ29tbWVudDM0MzcwNzY3Ng== 9599 2017-11-12T01:49:07Z 2017-11-12T01:49:07Z OWNER Here's the new design: <img width="691" alt="parlgov-development" src="https://user-images.githubusercontent.com/9599/32695161-82821226-c708-11e7-835c-b3d91850b2e0.png"> Also lists views at the bottom (refs #54): <img width="345" alt="parlgov-development" src="https://user-images.githubusercontent.com/9599/32695164-99efa7de-c708-11e7-8272-bc5f5b870b84.png"> {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273054652  
https://github.com/simonw/datasette/issues/42#issuecomment-343708447 https://api.github.com/repos/simonw/datasette/issues/42 343708447 MDEyOklzc3VlQ29tbWVudDM0MzcwODQ0Nw== 9599 2017-11-12T02:12:15Z 2017-11-12T02:12:15Z OWNER I ditched the metadata file concept. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268591332  
https://github.com/simonw/datasette/issues/65#issuecomment-343709217 https://api.github.com/repos/simonw/datasette/issues/65 343709217 MDEyOklzc3VlQ29tbWVudDM0MzcwOTIxNw== 9599 2017-11-12T02:36:37Z 2017-11-12T02:36:37Z OWNER <img width="982" alt="nhsadmin" src="https://user-images.githubusercontent.com/9599/32695392-3ea12612-c70f-11e7-873b-9e6ad2c869e7.png"> {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273191608  
https://github.com/simonw/datasette/issues/25#issuecomment-343715915 https://api.github.com/repos/simonw/datasette/issues/25 343715915 MDEyOklzc3VlQ29tbWVudDM0MzcxNTkxNQ== 9599 2017-11-12T06:08:28Z 2017-11-12T06:08:28Z OWNER con = sqlite3.connect('existing_db.db') with open('dump.sql', 'w') as f: for line in con.iterdump(): f.write('%s\n' % line) {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 267857622  
https://github.com/simonw/datasette/issues/42#issuecomment-343752404 https://api.github.com/repos/simonw/datasette/issues/42 343752404 MDEyOklzc3VlQ29tbWVudDM0Mzc1MjQwNA== 9599 2017-11-12T17:20:10Z 2017-11-12T17:20:10Z OWNER Re-opening this - I've decided to bring back this concept, see #68 {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 268591332  
https://github.com/simonw/datasette/issues/69#issuecomment-343752579 https://api.github.com/repos/simonw/datasette/issues/69 343752579 MDEyOklzc3VlQ29tbWVudDM0Mzc1MjU3OQ== 9599 2017-11-12T17:22:39Z 2017-11-12T17:22:39Z OWNER By default I'll allow LIMIT and OFFSET up to a maximum of X (where X is let's say 50,000 to start with, but can be custom configured to a larger number or set to None for no limit). {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273248366  
https://github.com/simonw/datasette/issues/66#issuecomment-343752683 https://api.github.com/repos/simonw/datasette/issues/66 343752683 MDEyOklzc3VlQ29tbWVudDM0Mzc1MjY4Mw== 9599 2017-11-12T17:24:05Z 2017-11-12T17:24:21Z OWNER Maybe SQL views should have their own Sanic view class (`ViewView` is kinda funny), subclassed from `TableView`? {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273191806  
https://github.com/simonw/datasette/issues/68#issuecomment-343753999 https://api.github.com/repos/simonw/datasette/issues/68 343753999 MDEyOklzc3VlQ29tbWVudDM0Mzc1Mzk5OQ== 9599 2017-11-12T17:45:21Z 2017-11-12T19:38:33Z OWNER For initial launch, I could just support this as some optional command line arguments you pass to the publish command: datasette publish data.db --title="Title" --source="url" {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273247186  
https://github.com/simonw/datasette/issues/68#issuecomment-343754058 https://api.github.com/repos/simonw/datasette/issues/68 343754058 MDEyOklzc3VlQ29tbWVudDM0Mzc1NDA1OA== 9599 2017-11-12T17:46:13Z 2017-11-12T17:46:13Z OWNER I’m going to store this stuff in a file called metadata.json and move the existing automatically generated metadata to a file called build.json {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273247186  
https://github.com/simonw/datasette/issues/57#issuecomment-343769692 https://api.github.com/repos/simonw/datasette/issues/57 343769692 MDEyOklzc3VlQ29tbWVudDM0Mzc2OTY5Mg== 9599 2017-11-12T21:32:36Z 2017-11-12T21:32:36Z OWNER I have created a Docker Hub public repository for this: https://hub.docker.com/r/simonwillison/datasette/ {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273127694  
https://github.com/simonw/datasette/issues/69#issuecomment-343780039 https://api.github.com/repos/simonw/datasette/issues/69 343780039 MDEyOklzc3VlQ29tbWVudDM0Mzc4MDAzOQ== 9599 2017-11-13T00:05:27Z 2017-11-13T00:05:27Z OWNER I think the only safe way to do this is using SQLite `.fetchmany(1000)` - I can't guarantee that the user has not entered SQL that will outfox a limit in some way. So instead of attempting to edit their SQL, I'll always return 1001 records and let them know if they went over 1000 or not. {"total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0} 273248366  
Powered by Datasette · Query took 2.09ms · About: simonw/datasette-graphql