{"id": 444997937, "node_id": "MDU6SXNzdWU0NDQ5OTc5Mzc=", "number": 470, "title": "/-/databases showing currently attached database details", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 4305096, "label": "0.28"}, "comments": 1, "created_at": "2019-05-16T14:45:18Z", "updated_at": "2019-05-19T19:28:44Z", "closed_at": "2019-05-16T14:50:26Z", "author_association": "OWNER", "pull_request": null, "body": "Split from #419. Mainly useful to see what is connected as mutable v.s. immutable.\r\n\r\nAlso helps fill the gap left by `/-/inspect` until #465 ", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/470/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 421551434, "node_id": "MDU6SXNzdWU0MjE1NTE0MzQ=", "number": 419, "title": "Default to opening files in mutable mode, special option for immutable files", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 4305096, "label": "0.28"}, "comments": 10, "created_at": "2019-03-15T14:39:27Z", "updated_at": "2019-05-16T15:14:32Z", "closed_at": "2019-05-16T15:14:31Z", "author_association": "OWNER", "pull_request": null, "body": "One of the original ideas behind Datasette was that serving immutable data makes everything way easier. Two examples: You don't have to worry about SQLite concurrency and you can bundle the database inside a Docker container and deploy it to immutable hosting. See [The interesting ideas in Datasette](https://simonwillison.net/2018/Oct/4/datasette-ideas/) for more on this.\r\n\r\nI'm beginning to see a much stronger case for being able to serve mutable data as well.\r\n\r\nSQLite is actually perfectly capable of handling reads against a database that is also being written to, even if the writes are coming from another process. https://www.sqlite.org/wal.htm\r\n\r\nThere are all kinds of interesting use-cases which Datasette is currently unsuitable for due to its insistence on immutable databases. Some examples:\r\n\r\n* Continually run Datasette against a SQLite database updated by another process, e.g. Firefox bookmarks\r\n* Projects where a cron runs every X minutes and writes new entries gathered from other sources to SQLite\r\n* Tail a log file, write those log updates to a SQLite file, view recent log entries in Datasette\r\n\r\nThis is also relevant to #417, Datasette Library.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/419/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 421548881, "node_id": "MDU6SXNzdWU0MjE1NDg4ODE=", "number": 418, "title": "Hashed URLs should be optional", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 4305096, "label": "0.28"}, "comments": 5, "created_at": "2019-03-15T14:34:12Z", "updated_at": "2019-05-16T15:12:26Z", "closed_at": "2019-05-16T15:12:26Z", "author_association": "OWNER", "pull_request": null, "body": "The cute performance hack where a hash of the DB contents is included in the URL makes a lot less sense when serving files that frequently change. It's also difficult to explain to people.\r\n\r\nIt should be optional and default to \"off\".\r\n\r\nNeeded for #417 and #419", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/418/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 445003029, "node_id": "MDU6SXNzdWU0NDUwMDMwMjk=", "number": 471, "title": "?_hash=1 and --config hash_urls:1 should only work for immutable databases", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 4305096, "label": "0.28"}, "comments": 1, "created_at": "2019-05-16T14:54:25Z", "updated_at": "2019-05-16T15:11:03Z", "closed_at": "2019-05-16T15:11:03Z", "author_association": "OWNER", "pull_request": null, "body": "Split from #419.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/471/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 443023308, "node_id": "MDU6SXNzdWU0NDMwMjMzMDg=", "number": 462, "title": "Replace most of `.inspect()` (and `datasette inspect`) with table counting", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 4305096, "label": "0.28"}, "comments": 4, "created_at": "2019-05-11T18:26:06Z", "updated_at": "2019-05-16T14:31:05Z", "closed_at": "2019-05-16T14:31:05Z", "author_association": "OWNER", "pull_request": null, "body": "This is the last part of #419 - with the move to supporting mutable databases by default, the inspect-data mechanism currently in use no-longer makes much sense.\r\n\r\nThe one optimization I think it's worth keeping for databases opened in immutable mode is the cached table counts. I think `datasette inspect` should cut down to only counting the rows in the tables - the other things done by inspect (figuring out columns, foreign key relationships, FTS etc) should all be fast enough that they can be reliably performed at runtime even against large databases.\r\n\r\nIf performing them at run-time has performance issues, I would rather cache those results internally within Datasette after they are first calculated than continue to support them in the `datasette inspect` command - to keep things simpler.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/462/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 443034218, "node_id": "MDU6SXNzdWU0NDMwMzQyMTg=", "number": 464, "title": "Add Glitch to Getting Started docs section", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 4305096, "label": "0.28"}, "comments": 1, "created_at": "2019-05-11T20:39:39Z", "updated_at": "2019-05-16T05:04:35Z", "closed_at": "2019-05-16T05:03:46Z", "author_association": "OWNER", "pull_request": null, "body": "Glitch is by far the easiest way to start trying out Datasette. Add a section to https://datasette.readthedocs.io/en/latest/getting_started.html", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/464/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 443020810, "node_id": "MDU6SXNzdWU0NDMwMjA4MTA=", "number": 460, "title": "Design changes to homepage to support mutable files", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 4305096, "label": "0.28"}, "comments": 5, "created_at": "2019-05-11T17:58:05Z", "updated_at": "2019-05-16T03:34:09Z", "closed_at": "2019-05-16T03:24:16Z", "author_association": "OWNER", "pull_request": null, "body": "Needed for #419 - since we can now start up Datasette with a whole bunch of large connected databases that are mutable we can no longer guarantee a quick count of rows across all of the tables.\r\n\r\nNew proposed homepage tweaks:\r\n\r\n\"Datasette__blah__commits__events__fixtures__fixtures_modifyme__modme__nerds__out__russian-ads__salaries__sf-trees__sortable__this-db-will-change\"\r\n", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/460/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 444711254, "node_id": "MDU6SXNzdWU0NDQ3MTEyNTQ=", "number": 467, "title": "Index page row counts only for DBs with < 30 tables (10ms count limit per table)", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 4305096, "label": "0.28"}, "comments": 2, "created_at": "2019-05-16T01:21:36Z", "updated_at": "2019-05-16T03:03:45Z", "closed_at": "2019-05-16T03:03:45Z", "author_association": "OWNER", "pull_request": null, "body": "Split out from #460.\r\n\r\nIf a database is mutable, calculating row counts gets expensive. I'm only going to calculate row counts for the index page if it has less than X tables (both hidden and non-hidden) AND each table can be counted in less than 10ms.\r\n\r\nIf any count takes longer than 10ms I'll cancel the counting entirely. We currently show an inaccurate count if this happens, which is just confusing.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/467/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 377266351, "node_id": "MDU6SXNzdWUzNzcyNjYzNTE=", "number": 373, "title": "Views should be shown on root/index page along with tables", "user": {"value": 416374, "label": "gfrmin"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 4305096, "label": "0.28"}, "comments": 1, "created_at": "2018-11-05T06:28:41Z", "updated_at": "2019-05-16T00:29:22Z", "closed_at": "2019-05-16T00:29:22Z", "author_association": "CONTRIBUTOR", "pull_request": null, "body": "At the moment the number of views is given on a datasette \"homepage\", but not links to any views themselves", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/373/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"}