{"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.1.1", "id": 35902315, "node_id": "MDc6UmVsZWFzZTM1OTAyMzE1", "tag_name": "3.1.1", "target_commitish": "main", "name": "3.1.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-01-01T23:56:20Z", "published_at": "2021-01-01T23:57:07Z", "body": "- Fixed failing test caused by `optimize` sometimes creating larger database files. ([#209](https://github.com/simonw/sqlite-utils/issues/209))\r\n- Documentation now lives on \r\n- README now includes `brew install sqlite-utils` installation method.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.59.3", "id": 53781549, "node_id": "RE_kwDOBm6k_c4DNKQt", "tag_name": "0.59.3", "target_commitish": "main", "name": "0.59.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-11-20T23:40:21Z", "published_at": "2021-11-20T23:41:33Z", "body": "- Fixed numerous bugs when running Datasette [behind a proxy](https://docs.datasette.io/en/stable/deploying.html#deploying-proxy) with a prefix URL path using the [base_url](https://docs.datasette.io/en/stable/settings.html#setting-base-url) setting. A live demo of this mode is now available at [datasette-apache-proxy-demo.datasette.io/prefix/](https://datasette-apache-proxy-demo.datasette.io/prefix/). ([#1519](https://github.com/simonw/datasette/issues/1519), [#838](https://github.com/simonw/datasette/issues/838))\r\n- `?column__arraycontains=` and `?column__arraynotcontains=` table parameters now also work against SQL views. ([#448](https://github.com/simonw/datasette/issues/448))\r\n- `?_facet_array=column` no longer returns incorrect counts if columns contain the same value more than once.", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.57.1", "id": 44292523, "node_id": "MDc6UmVsZWFzZTQ0MjkyNTIz", "tag_name": "0.57.1", "target_commitish": "main", "name": "0.57.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-06-08T16:26:45Z", "published_at": "2021-06-08T16:28:31Z", "body": "- Fixed visual display glitch with global navigation menu. ([#1367](https://github.com/simonw/datasette/issues/1367))\r\n- No longer truncates the list of table columns displayed on the `/database` page. ([#1364](https://github.com/simonw/datasette/issues/1364))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/releases/44292523/reactions\", \"total_count\": 4, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 4, \"rocket\": 0, \"eyes\": 0}"} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.2", "id": 34725716, "node_id": "MDc6UmVsZWFzZTM0NzI1NzE2", "tag_name": "0.52.2", "target_commitish": "main", "name": "0.52.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-03T00:57:40Z", "published_at": "2020-12-03T00:58:43Z", "body": "- Generated columns from SQLite 3.31.0 or higher are now correctly displayed. ([#1116](https://github.com/simonw/datasette/issues/1116))\r\n- Error message if you attempt to open a SpatiaLite database now suggests using `--load-extension=spatialite` if it detects that the extension is available in a common location. ([#1115](https://github.com/simonw/datasette/issues/1115))\r\n- `OPTIONS` requests against the `/database` page no longer raise a 500 error. ([#1100](https://github.com/simonw/datasette/issues/1100))\r\n- Databases larger than 32MB that are published to Cloud Run can now be downloaded. ([#749](https://github.com/simonw/datasette/issues/749))\r\n- Fix for misaligned cog icon on table and database pages. Thanks, Abdussamet Ko\u00e7ak. ([#1121](https://github.com/simonw/datasette/issues/1121))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.22", "id": 56875206, "node_id": "RE_kwDOCGYnMM4DY9jG", "tag_name": "3.22", "target_commitish": "main", "name": "3.22", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2022-01-11T23:44:48Z", "published_at": "2022-01-11T23:49:28Z", "body": "- New [CLI reference](https://sqlite-utils.datasette.io/en/stable/cli-reference.html#cli-reference) documentation page, listing the output of `--help` for every one of the CLI commands. ([#383](https://github.com/simonw/sqlite-utils/issues/383))\r\n- `sqlite-utils rows` now has `--limit` and `--offset` options for paginating through data. ([#381](https://github.com/simonw/sqlite-utils/issues/381))\r\n- `sqlite-utils rows` now has `--where` and `-p` options for filtering the table using a `WHERE` query, see [Returning all rows in a table](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-rows). ([#382](https://github.com/simonw/sqlite-utils/issues/382))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.12", "id": 45251624, "node_id": "MDc6UmVsZWFzZTQ1MjUxNjI0", "tag_name": "3.12", "target_commitish": "main", "name": "3.12", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-06-25T17:59:05Z", "published_at": "2021-06-25T18:00:18Z", "body": "- New [db.query(sql, params)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-query) method, which executes a SQL query and returns the results as an iterator over Python dictionaries. ([#290](https://github.com/simonw/sqlite-utils/issues/290))\r\n- This project now uses `flake8` and has started to use `mypy`. ([#291](https://github.com/simonw/sqlite-utils/issues/291))\r\n- New documentation on [contributing](https://sqlite-utils.datasette.io/en/stable/contributing.html#contributing) to this project. ([#292](https://github.com/simonw/sqlite-utils/issues/292))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.51a2", "id": 33284522, "node_id": "MDc6UmVsZWFzZTMzMjg0NTIy", "tag_name": "0.51a2", "target_commitish": "main", "name": "0.51a2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-10-30T17:56:02Z", "published_at": "2020-10-30T17:57:53Z", "body": "- New [load_template(template, request, datasette)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-load-template) plugin hook. ([#1042](https://github.com/simonw/datasette/issues/1042))\r\n- New [debug-menu](https://docs.datasette.io/en/latest/authentication.html#permissions-debug-menu) permission. ([#1068](https://github.com/simonw/datasette/issues/1068))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.28", "id": 72130482, "node_id": "RE_kwDOCGYnMM4ETJ-y", "tag_name": "3.28", "target_commitish": "main", "name": "3.28", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2022-07-15T22:56:01Z", "published_at": "2022-07-15T23:02:45Z", "body": "- New [table.duplicate(new_name)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-duplicate) method for creating a copy of a table with a matching schema and row contents. Thanks, [David](https://github.com/davidleejy). ([#449](https://github.com/simonw/sqlite-utils/issues/449))\r\n- New `sqlite-utils duplicate data.db table_name new_name` CLI command for [Duplicating tables](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-duplicate-table). ([#454](https://github.com/simonw/sqlite-utils/issues/454))\r\n- `sqlite_utils.utils.rows_from_file()` is now a [documented API](https://sqlite-utils.datasette.io/en/stable/reference.html#reference-utils-rows-from-file). It can be used to read a sequence of dictionaries from a file-like object containing CSV, TSV, JSON or newline-delimited JSON. It can be passed an explicit format or can attempt to detect the format automatically. ([#443](https://github.com/simonw/sqlite-utils/issues/443))\r\n- `sqlite_utils.utils.TypeTracker` is now a documented API for detecting the likely column types for a sequence of string rows, see [Detecting column types using TypeTracker](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-typetracker). ([#445](https://github.com/simonw/sqlite-utils/issues/445))\r\n- `sqlite_utils.utils.chunks()` is now a documented API for [splitting an iterator into chunks](https://sqlite-utils.datasette.io/en/stable/reference.html#reference-utils-chunks). ([#451](https://github.com/simonw/sqlite-utils/issues/451))\r\n- `sqlite-utils enable-fts` now has a `--replace` option for replacing the existing FTS configuration for a table. ([#450](https://github.com/simonw/sqlite-utils/issues/450))\r\n- The `create-index`, `add-column` and `duplicate` commands all now take a `--ignore` option for ignoring errors should the database not be in the right state for them to operate. ([#450](https://github.com/simonw/sqlite-utils/issues/450))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.22", "id": 32688819, "node_id": "MDc6UmVsZWFzZTMyNjg4ODE5", "tag_name": "2.22", "target_commitish": "main", "name": "2.22", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-10-16T19:30:25Z", "published_at": "2020-10-16T19:31:45Z", "body": "- New `--encoding` option for processing CSV and TSV files that use a non-utf-8 encoding, for both the `insert` and `update` commands. ([#182](https://github.com/simonw/sqlite-utils/issues/182))\r\n- The `--load-extension` option is now available to many more commands. ([#137](https://github.com/simonw/sqlite-utils/issues/137))\r\n- `--load-extension=spatialite` can be used to load SpatiaLite from common installation locations, if it is available. ([#136](https://github.com/simonw/sqlite-utils/issues/136))\r\n- Tests now also run against Python 3.9. ([#184](https://github.com/simonw/sqlite-utils/issues/184))\r\n- Passing `pk=[\"id\"]` now has the same effect as passing `pk=\"id\"`. ([#181](https://github.com/simonw/sqlite-utils/issues/181))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.11", "id": 28369250, "node_id": "MDc6UmVsZWFzZTI4MzY5MjUw", "tag_name": "2.11", "target_commitish": "master", "name": "2.11", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-07-08T17:36:07Z", "published_at": "2020-07-08T17:36:45Z", "body": "- New `--truncate` option to `sqlite-utils insert`, and `truncate=True` argument to `.insert_all()`. Thanks, Thomas Sibley. ([#118](https://github.com/simonw/sqlite-utils/pull/118))\r\n- The `sqlite-utils query` command now runs updates in a transaction. Thanks, Thomas Sibley. ([#120](https://github.com/simonw/sqlite-utils/pull/120))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.15", "id": 29529316, "node_id": "MDc6UmVsZWFzZTI5NTI5MzE2", "tag_name": "2.15", "target_commitish": "master", "name": "2.15", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-10T19:06:02Z", "published_at": "2020-08-10T19:07:27Z", "body": "- New `db.enable_wal()` and `db.disable_wal()` methods for enabling and disabling [Write-Ahead Logging](https://www.sqlite.org/wal.html) for a database file - see [WAL mode](https://sqlite-utils.readthedocs.io/en/stable//python-api.html#python-api-wal) in the Python API documentation.\r\n- Also `sqlite-utils enable-wal file.db` and `sqlite-utils disable-wal file.db` commands for doing the same thing on the command-line, see [WAL mode (CLI)](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-wal). ([#132](https://github.com/simonw/sqlite-utils/issues/132))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.26", "id": 64414802, "node_id": "RE_kwDOCGYnMM4D1uRS", "tag_name": "3.26", "target_commitish": "main", "name": "3.26", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2022-04-13T22:51:48Z", "published_at": "2022-04-13T22:53:36Z", "body": "- New `errors=r.IGNORE/r.SET_NULL` parameter for the `r.parsedatetime()` and `r.parsedate()` [convert recipes](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert-recipes). ([#416](https://github.com/simonw/sqlite-utils/issues/416))\r\n- Fixed a bug where `--multi` could not be used in combination with `--dry-run` for the [convert](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert) command. ([#415](https://github.com/simonw/sqlite-utils/issues/415))\r\n- New documentation: [Using a convert() function to execute initialization](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert-complex). ([#420](https://github.com/simonw/sqlite-utils/issues/420))\r\n- More robust detection for whether or not `deterministic=True` is supported. ([#425](https://github.com/simonw/sqlite-utils/issues/425))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.25", "id": 60770975, "node_id": "RE_kwDOCGYnMM4Dn0qf", "tag_name": "3.25", "target_commitish": "main", "name": "3.25", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2022-03-02T06:34:46Z", "published_at": "2022-03-02T06:35:18Z", "body": "- New `hash_id_columns=` parameter for creating a primary key that's a hash of the content of specific columns - see [Setting an ID based on the hash of the row contents](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-hash) for details. ([#343](https://github.com/simonw/sqlite-utils/issues/343))\r\n- New [db.sqlite_version](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-sqlite-version) property, returning a tuple of integers representing the version of SQLite, for example `(3, 38, 0)`.\r\n- Fixed a bug where [register_function(deterministic=True)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-register-function) caused errors on versions of SQLite prior to 3.8.3. ([#408](https://github.com/simonw/sqlite-utils/issues/408))\r\n- New documented [hash_record(record, keys=...)](https://sqlite-utils.datasette.io/en/stable/reference.html#reference-utils-hash-record) function.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.19", "id": 31581701, "node_id": "MDc6UmVsZWFzZTMxNTgxNzAx", "tag_name": "2.19", "target_commitish": "main", "name": "2.19", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-09-20T22:22:56Z", "published_at": "2020-09-20T22:24:04Z", "body": "- New `sqlite-utils add-foreign-keys` command for [Adding multiple foreign keys at once](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-add-foreign-keys). ([#157](https://github.com/simonw/sqlite-utils/issues/157))\r\n- New `table.enable_fts(..., replace=True)` argument for replacing an existing FTS table with a new configuration. ([#160](https://github.com/simonw/sqlite-utils/issues/160))\r\n- New `table.add_foreign_key(..., ignore=True)` argument for ignoring a foreign key if it already exists. ([#112](https://github.com/simonw/sqlite-utils/issues/112))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.9", "id": 26362623, "node_id": "MDc6UmVsZWFzZTI2MzYyNjIz", "tag_name": "2.9", "target_commitish": "master", "name": "2.9", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-05-11T01:54:56Z", "published_at": "2020-05-11T01:57:11Z", "body": "- New `sqlite-utils drop-table` command, see [Dropping tables](https://sqlite-utils.readthedocs.io/en/2.9/cli.html#cli-drop-table). ([#111](https://github.com/simonw/sqlite-utils/issues/111))\r\n- New `sqlite-utils drop-view` command, see [Dropping views](https://sqlite-utils.readthedocs.io/en/2.9/cli.html#cli-drop-view).\r\n- Python `decimal.Decimal` objects are now stored as `FLOAT`. ([#110](https://github.com/simonw/sqlite-utils/issues/110))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.8", "id": 44019361, "node_id": "MDc6UmVsZWFzZTQ0MDE5MzYx", "tag_name": "3.8", "target_commitish": "main", "name": "3.8", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-06-03T05:16:33Z", "published_at": "2021-06-03T05:17:33Z", "body": "- New `sqlite-utils indexes` command to list indexes in a database, see [Listing indexes](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-indexes). ([#263](https://github.com/simonw/sqlite-utils/issues/263))\r\n- `table.xindexes` introspection property returning more details about that table's indexes, see [.xindexes](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-introspection-xindexes). ([#261](https://github.com/simonw/sqlite-utils/issues/261))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.11", "id": 44927292, "node_id": "MDc6UmVsZWFzZTQ0OTI3Mjky", "tag_name": "3.11", "target_commitish": "main", "name": "3.11", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-06-20T18:52:15Z", "published_at": "2021-06-20T18:53:09Z", "body": "- New `sqlite-utils memory data.csv --schema` option, for outputting the schema of the in-memory database generated from one or more files. See [--schema, --dump and --save](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-memory-schema-dump-save). ([#288](https://github.com/simonw/sqlite-utils/issues/288))\r\n- Added [installation instructions](https://sqlite-utils.datasette.io/en/stable/installation.html#installation). ([#286](https://github.com/simonw/sqlite-utils/issues/286))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.9", "id": 44511190, "node_id": "MDc6UmVsZWFzZTQ0NTExMTkw", "tag_name": "3.9", "target_commitish": "main", "name": "3.9", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-06-12T02:07:18Z", "published_at": "2021-06-12T02:08:03Z", "body": "- New `sqlite-utils schema` command showing the full SQL schema for a database, see [Showing the schema (CLI)](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-schema). ([#268](https://github.com/simonw/sqlite-utils/issues/268))\r\n- `db.schema` introspection property exposing the same feature to the Python library, see [Showing the schema (Python library)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-schema).", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/sqlite-utils/releases/44511190/reactions\", \"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}"} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.7", "id": 43797212, "node_id": "MDc6UmVsZWFzZTQzNzk3MjEy", "tag_name": "3.7", "target_commitish": "main", "name": "3.7", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-05-29T05:47:59Z", "published_at": "2021-05-29T05:49:59Z", "body": "- New `table.pks_and_rows_where()` method returning `(primary_key, row_dictionary)` tuples - see [Listing rows with their primary keys](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-pks-and-rows-where). ([#240](https://github.com/simonw/sqlite-utils/issues/240))\r\n- Fixed bug with *table.add_foreign_key()* against columns containing spaces. ([#238](https://github.com/simonw/sqlite-utils/issues/238))\r\n- `table_or_view.drop(ignore=True)` option for avoiding errors if the table or view does not exist. ([#237](https://github.com/simonw/sqlite-utils/issues/237))\r\n- `sqlite-utils drop-view --ignore` and `sqlite-utils drop-table --ignore` options. ([#237](https://github.com/simonw/sqlite-utils/issues/237))\r\n- Fixed a bug with inserts of nested JSON containing non-ascii strings - thanks, Dylan Wu. ([#257](https://github.com/simonw/sqlite-utils/issues/257))\r\n- Suggest `--alter` if an error occurs caused by a missing column. ([#259](https://github.com/simonw/sqlite-utils/issues/259))\r\n- Support creating indexes with columns in descending order, see [API documentation](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-create-index) and [CLI documentation](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-create-index). ([#260](https://github.com/simonw/sqlite-utils/issues/260))\r\n- Correctly handle CSV files that start with a UTF-8 BOM. ([#250](https://github.com/simonw/sqlite-utils/issues/250))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.50a0", "id": 32072114, "node_id": "MDc6UmVsZWFzZTMyMDcyMTE0", "tag_name": "0.50a0", "target_commitish": "main", "name": "0.50a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-10-01T23:35:04Z", "published_at": "2020-10-01T23:35:54Z", "body": "- New column action menu - table columns now show a cog icon which provides a contextual menu for that column. ([#981](https://github.com/simonw/datasette/issues/981))\r\n- New `datasette -o` option which opens your browser as soon as Datasette starts up. ([#970](https://github.com/simonw/datasette/issues/970)\r\n- `sqlite3.enable_callback_tracebacks(True)` so errors in custom SQL functions will now display tracebacks. ([#891](https://github.com/simonw/datasette/issues/891))\r\n- Fixed two rendering bugs with column headers in portrait mobile view. ([#978](https://github.com/simonw/datasette/issues/978), [#980](https://github.com/simonw/datasette/issues/980))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.1", "id": 35200016, "node_id": "MDc6UmVsZWFzZTM1MjAwMDE2", "tag_name": "3.1", "target_commitish": "main", "name": "3.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-13T07:30:59Z", "published_at": "2020-12-13T07:31:40Z", "body": "- New command: `sqlite-utils analyze-tables my.db` outputs useful information about the table columns in the database, such as the number of distinct values and how many rows are null. See [Analyzing tables](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-analyze-tables) for documentation. ([#207](https://github.com/simonw/sqlite-utils/issues/207))\r\n- New `table.analyze_column(column)` Python method used by the `analyze-tables` command - see [Analyzing a column](https://sqlite-utils.readthedocs.io/en/stable/python-api.html#python-api-analyze-column).\r\n- The `table.update()` method now correctly handles values that should be stored as JSON. Thanks, Andreas Madsack. ([#204](https://github.com/simonw/sqlite-utils/pull/204))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.60a0", "id": 55569404, "node_id": "RE_kwDOBm6k_c4DT-v8", "tag_name": "0.60a0", "target_commitish": "main", "name": "0.60a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2021-12-17T19:13:51Z", "published_at": "2021-12-17T19:15:38Z", "body": "- New plugin hook: [filters_from_request(request, database, table, datasette)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-filters-from-request), which runs on the table page and can be used to support new custom query string parameters that modify the SQL query. ([#473](https://github.com/simonw/datasette/issues/473))\r\n- The number of unique values in a facet is now always displayed. Previously it was only displayed if the user specified `?_facet_size=max`. ([#1556](https://github.com/simonw/datasette/issues/1556))\r\n- Fixed bug where `?_facet_array=tags&_facet=tags` would only display one of the two selected facets. ([#625](https://github.com/simonw/datasette/issues/625))\r\n- Facets of type `date` or `array` can now be configured in `metadata.json`, see [Facets in metadata.json](https://docs.datasette.io/en/latest/facets.html#facets-metadata). Thanks, David Larlet. ([#1552](https://github.com/simonw/datasette/issues/1552))\r\n- New `?_nosuggest=1` parameter for table views, which disables facet suggestion. ([#1557](https://github.com/simonw/datasette/issues/1557))\r\n- Label columns detected for foreign keys are now case-insensitive, so `Name` or `TITLE` will be detected in the same way as `name` or `title`. ([#1544](https://github.com/simonw/datasette/issues/1544))\r\n- The query string variables exposed by `request.args` will now include blank strings for arguments such as `foo` in `?foo=&bar=1` rather than ignoring those parameters entirely. ([#1551](https://github.com/simonw/datasette/issues/1551))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.58a1", "id": 45182156, "node_id": "MDc6UmVsZWFzZTQ1MTgyMTU2", "tag_name": "0.58a1", "target_commitish": "main", "name": "0.58a1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2021-06-24T16:24:59Z", "published_at": "2021-06-24T16:29:09Z", "body": "- New plugin hook: [skip_csrf(datasette, scope)](https://docs.datasette.io/en/latest//plugin_hooks.html#plugin-hook-skip-csrf), for opting out of CSRF protection based on the incoming request. ([#1377](https://github.com/simonw/datasette/issues/1377))\r\n- `POST` requests to endpoints that do not support that HTTP verb now return a 405 error.\r\n- `db.path` can now be provided as a `pathlib.Path` object, useful when writing unit tests for plugins. Thanks, Chris Amico. ([#1365](https://github.com/simonw/datasette/issues/1365))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/releases/45182156/reactions\", \"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}"} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.15.1", "id": 47636109, "node_id": "MDc6UmVsZWFzZTQ3NjM2MTA5", "tag_name": "3.15.1", "target_commitish": "main", "name": "3.15.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-08-10T23:55:12Z", "published_at": "2021-08-10T23:55:38Z", "body": "- Python library now includes type annotations on almost all of the methods, plus detailed docstrings describing each one. ([#311](https://github.com/simonw/sqlite-utils/issues/311))\r\n- New [API Reference](https://sqlite-utils.datasette.io/en/stable/reference.html) documentation page, powered by those docstrings.\r\n- Fixed bug where `.add_foreign_keys()` failed to raise an error if called against a `View`. ([#313](https://github.com/simonw/sqlite-utils/issues/313))\r\n- Fixed bug where `.delete_where()` returned a `[]` instead of returning `self` if called against a non-existant table. ([#315](https://github.com/simonw/sqlite-utils/issues/315))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/sqlite-utils/releases/47636109/reactions\", \"total_count\": 1, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 1, \"rocket\": 0, \"eyes\": 0}"} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.61a0", "id": 62259800, "node_id": "RE_kwDOBm6k_c4DtgJY", "tag_name": "0.61a0", "target_commitish": "main", "name": "0.61a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2022-03-20T01:14:40Z", "published_at": "2022-03-20T01:16:41Z", "body": "- Removed hashed URL mode from Datasette. The new `datasette-hashed-urls` plugin can be used to achieve the same result, see [datasette-hashed-urls](https://docs.datasette.io/en/latest/performance.html#performance-hashed-urls) for details. ([#1661](https://github.com/simonw/datasette/issues/1661))\r\n- Databases can now have a custom path within the Datasette instance that is indpendent of the database name, using the `db.route` property. ([#1668](https://github.com/simonw/datasette/issues/1668))\r\n- URLs within Datasette now use a different encoding scheme for tables or databases that include \"special\" characters outside of the range of `a-zA-Z0-9_-`. This scheme is explained here: [Tilde encoding](https://docs.datasette.io/en/latest/internals.html#internals-tilde-encoding). ([#1657](https://github.com/simonw/datasette/issues/1657))\r\n- Table and row HTML pages now include a `` element and return a `Link: URL; rel=\"alternate\"; type=\"application/json+datasette\"` HTTP header pointing to the JSON version of those pages. ([#1533](https://github.com/simonw/datasette/issues/1533))\r\n- `Access-Control-Expose-Headers: Link` is now added to the CORS headers, allowing remote JavaScript to access that header.\r\n- Canned queries are now shown at the top of the database page, directly below the SQL editor. Previously they were shown at the bottom, below the list of tables. ([#1612](https://github.com/simonw/datasette/issues/1612))\r\n- Datasette now has a default favicon. ([#1603](https://github.com/simonw/datasette/issues/1603))\r\n- `sqlite_stat` tables are now hidden by default. ([#1587](https://github.com/simonw/datasette/issues/1587))\r\n- SpatiaLite tables `data_licenses`, `KNN` and `KNN2` are now hidden by default. ([#1601](https://github.com/simonw/datasette/issues/1601))\r\n- Python 3.6 is no longer supported. ([#1577](https://github.com/simonw/datasette/issues/1577))\r\n- Tests now run against Python 3.11-dev. ([#1621](https://github.com/simonw/datasette/issues/1621))\r\n- Fixed bug where [custom pages](https://docs.datasette.io/en/latest/custom_templates.html#custom-pages) did not work on Windows. Thanks, Robert Christie. ([#1545](https://github.com/simonw/datasette/issues/1545))\r\n- SQL query tracing mechanism now works for queries executed in `asyncio` sub-tasks, such as those created by `asyncio.gather()`. ([#1576](https://github.com/simonw/datasette/issues/1576))\r\n- [datasette.tracer](https://docs.datasette.io/en/latest/internals.html#internals-tracer) mechanism is now documented.\r\n- Common Datasette symbols can now be imported directly from the top-level `datasette` package, see [Import shortcuts](https://docs.datasette.io/en/latest/internals.html#internals-shortcuts). Those symbols are `Response`, `Forbidden`, `NotFound`, `hookimpl`, `actor_matches_allow`. ([#957](https://github.com/simonw/datasette/issues/957))\r\n- `/-/versions` page now returns additional details for libraries used by SpatiaLite. ([#1607](https://github.com/simonw/datasette/issues/1607))\r\n- Documentation now links to the [Datasette Tutorials](https://datasette.io/tutorials).\r\n- Datasette will now also look for SpatiaLite in `/opt/homebrew` - thanks, Dan Peterson. ([#1649](https://github.com/simonw/datasette/pull/1649))\r\n- Datasette is now covered by a [Code of Conduct](https://github.com/simonw/datasette/blob/main/CODE_OF_CONDUCT.md). ([#1654](https://github.com/simonw/datasette/issues/1654))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.4", "id": 34882011, "node_id": "MDc6UmVsZWFzZTM0ODgyMDEx", "tag_name": "0.52.4", "target_commitish": "main", "name": "0.52.4", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-05T19:42:42Z", "published_at": "2020-12-05T19:42:57Z", "body": "- Show [pysqlite3](https://github.com/coleifer/pysqlite3) version on `/-/versions`, if installed. ([#1125](https://github.com/simonw/datasette/issues/1125))\r\n- Errors output by Datasette (e.g. for invalid SQL queries) now go to `stderr`, not `stdout`. ([#1131](https://github.com/simonw/datasette/issues/1131))\r\n- Fix for a startup error on windows caused by unnecessary `from os import EX_CANTCREAT` - thanks, Abdussamet Ko\u00e7ak. ([#1094](https://github.com/simonw/datasette/issues/1094))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.24", "id": 59656694, "node_id": "RE_kwDOCGYnMM4Djkn2", "tag_name": "3.24", "target_commitish": "main", "name": "3.24", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2022-02-16T01:39:13Z", "published_at": "2022-02-16T01:41:50Z", "body": "- SpatiaLite helpers for the `sqlite-utils` command-line tool - thanks, Chris Amico. ([#398](https://github.com/simonw/sqlite-utils/issues/398))\r\n - [sqlite-utils create-database](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-create-database) `--init-spatialite` option for initializing SpatiaLite on a newly created database.\r\n - [sqlite-utils add-geometry-column](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-spatialite) command for adding geometry columns.\r\n - [sqlite-utils create-spatial-index](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-spatialite-indexes) command for adding spatial indexes.\r\n- `db[table].create(..., if_not_exists=True)` option for [creating a table](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-explicit-create) only if it does not already exist. ([#397](https://github.com/simonw/sqlite-utils/issues/397))\r\n- `Database(memory_name=\"my_shared_database\")` parameter for creating a [named in-memory database](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-connect) that can be shared between multiple connections. ([#405](https://github.com/simonw/sqlite-utils/issues/405))\r\n- Documentation now describes [how to add a primary key to a rowid table](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-transform-table-add-primary-key-to-rowid) using `sqlite-utils transform`. ([#403](https://github.com/simonw/sqlite-utils/issues/403))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/sqlite-utils/releases/59656694/reactions\", \"total_count\": 2, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 1, \"eyes\": 0}"} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.14", "id": 29196241, "node_id": "MDc6UmVsZWFzZTI5MTk2MjQx", "tag_name": "2.14", "target_commitish": "master", "name": "2.14", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-01T20:58:47Z", "published_at": "2020-08-01T21:00:31Z", "body": "- The [insert-files command](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-insert-files) can now read from standard input: `cat dog.jpg | sqlite-utils insert-files dogs.db pics - --name=dog.jpg`. ([#127](https://github.com/simonw/sqlite-utils/issues/127))\r\n- You can now specify a full-text search tokenizer using the new `tokenize=` parameter to [enable_fts()](https://sqlite-utils.readthedocs.io/en/stable/python-api.html#python-api-fts). This means you can enable Porter stemming on a table by running `db[\"articles\"].enable_fts([\"headline\", \"body\"], tokenize=\"porter\")`. ([#130](https://github.com/simonw/sqlite-utils/issues/130))\r\n- You can also set a custom tokenizer using the [sqlite-utils enable-fts](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-fts) CLI command, via the new `--tokenize` option.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.58a0", "id": 44388485, "node_id": "MDc6UmVsZWFzZTQ0Mzg4NDg1", "tag_name": "0.58a0", "target_commitish": "main", "name": "0.58a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2021-06-10T04:51:14Z", "published_at": "2021-06-10T04:52:45Z", "body": "- The [menu_links()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-menu-links), [table_actions()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-table-actions) and [database_actions()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-database-actions) plugin hooks all gained a new optional `request` argument providing access to the current request. ([#1371](https://github.com/simonw/datasette/issues/1371))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.59a1", "id": 47507174, "node_id": "MDc6UmVsZWFzZTQ3NTA3MTc0", "tag_name": "0.59a1", "target_commitish": "main", "name": "0.59a1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2021-08-09T01:13:03Z", "published_at": "2021-08-09T01:14:06Z", "body": "- The [render_cell()](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-render-cell) plugin hook can now return an awaitable function. This means the hook can execute SQL queries. ([#1425](https://github.com/simonw/datasette/issues/1425))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/releases/47507174/reactions\", \"total_count\": 1, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 1, \"rocket\": 0, \"eyes\": 0}"} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.17", "id": 48389722, "node_id": "MDc6UmVsZWFzZTQ4Mzg5NzIy", "tag_name": "3.17", "target_commitish": "main", "name": "3.17", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-08-24T23:40:18Z", "published_at": "2021-08-24T23:42:22Z", "body": "- The [sqlite-utils memory](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-memory) command has a new `--analyze` option, which runs the equivalent of the [analyze-tables](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-analyze-tables) command directly against the in-memory database created from the incoming CSV or JSON data. ([#320](https://github.com/simonw/sqlite-utils/issues/320))\r\n- [sqlite-utils insert-files](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-files) now has the ability to insert file contents in to `TEXT` columns in addition to the default `BLOB`. Pass the `--text` option or use `content_text` as a column specifier. ([#319](https://github.com/simonw/sqlite-utils/issues/319))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/sqlite-utils/releases/48389722/reactions\", \"total_count\": 1, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 1, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}"} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.19", "id": 53785562, "node_id": "RE_kwDOCGYnMM4DNLPa", "tag_name": "3.19", "target_commitish": "main", "name": "3.19", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-11-21T04:41:56Z", "published_at": "2021-11-21T04:42:24Z", "body": "- The [table.lookup() method](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-lookup-tables) now accepts keyword arguments that match those on the underlying `table.insert()` method: `foreign_keys=`, `column_order=`, `not_null=`, `defaults=`, `extracts=`, `conversions=` and `columns=`. You can also now pass `pk=` to specify a different column name to use for the primary key. ([#342](https://github.com/simonw/sqlite-utils/issues/342))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.47.3", "id": 29738457, "node_id": "MDc6UmVsZWFzZTI5NzM4NDU3", "tag_name": "0.47.3", "target_commitish": "main", "name": "0.47.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-15T20:56:08Z", "published_at": "2020-08-15T21:03:58Z", "body": "- The `datasette --get` command-line mechanism now ensures any plugins using the `startup()` hook are correctly executed. ([#934](https://github.com/simonw/datasette/issues/934))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.3", "id": 36530216, "node_id": "MDc6UmVsZWFzZTM2NTMwMjE2", "tag_name": "3.3", "target_commitish": "main", "name": "3.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-01-18T04:28:24Z", "published_at": "2021-01-18T04:29:48Z", "body": "- The `table.m2m()` method now accepts an optional `alter=True` argument to specify that any missing columns should be added to the referenced table. See [Working with many-to-many relationships](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-m2m). ([#222](https://github.com/simonw/sqlite-utils/issues/222))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.16", "id": 48077246, "node_id": "MDc6UmVsZWFzZTQ4MDc3MjQ2", "tag_name": "3.16", "target_commitish": "main", "name": "3.16", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-08-18T22:36:32Z", "published_at": "2021-08-18T22:37:55Z", "body": "- Type signatures added to more methods, including `table.resolve_foreign_keys()`, `db.create_table_sql()`, `db.create_table()` and `table.create()`. ([#314](https://github.com/simonw/sqlite-utils/issues/314))\r\n- New `db.quote_fts(value)` method, see [Quoting characters for use in search](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-quote-fts) - thanks, Mark Neumann. ([#246](https://github.com/simonw/sqlite-utils/issues/246))\r\n- `table.search()` now accepts an optional `quote=True` parameter. ([#296](https://github.com/simonw/sqlite-utils/issues/296))\r\n- CLI command `sqlite-utils search` now accepts a `--quote` option. ([#296](https://github.com/simonw/sqlite-utils/issues/296))\r\n- Fixed bug where `--no-headers` and `--tsv` options to [sqlite-utils insert](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv) could not be used together. ([#295](https://github.com/simonw/sqlite-utils/issues/295))\r\n- Various small improvements to [API reference](https://sqlite-utils.datasette.io/en/stable/reference.html#reference) documentation.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.49a1", "id": 31227999, "node_id": "MDc6UmVsZWFzZTMxMjI3OTk5", "tag_name": "0.49a1", "target_commitish": "main", "name": "0.49a1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-09-14T02:47:21Z", "published_at": "2020-09-14T02:48:19Z", "body": "- Upgraded [CodeMirror](https://codemirror.net/) to 5.57.0. ([#948](https://github.com/simonw/datasette/issues/948))\r\n- Upgraded code style to Black 20.8b1. ([#958](https://github.com/simonw/datasette/issues/958))\r\n- New `datasette --pdb` option. ([#962](https://github.com/simonw/datasette/issues/962))\r\n- `datasette --get` exit code now reflects the internal HTTP status code. ([#947](https://github.com/simonw/datasette/issues/947))\r\n- Fixed bug where selected facets were not correctly persisted in hidden form fields on the table page. ([#963](https://github.com/simonw/datasette/issues/963))\r\n- New mechanism for defining page templates with custom path parameters. ([#944](https://github.com/simonw/datasette/issues/944))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.49", "id": 31288240, "node_id": "MDc6UmVsZWFzZTMxMjg4MjQw", "tag_name": "0.49", "target_commitish": "main", "name": "0.49", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-09-14T21:38:24Z", "published_at": "2020-09-14T21:40:11Z", "body": "- Writable canned queries now expose a JSON API, see [JSON API for writable canned queries](https://docs.datasette.io/en/stable/sql_queries.html#canned-queries-json-api). ([#880](https://github.com/simonw/datasette/issues/880))\r\n- New mechanism for defining page templates with custom path parameters - a template file called `pages/about/{slug}.html` will be used to render any requests to `/about/something`. See [Path parameters for pages](https://docs.datasette.io/en/stable/custom_templates.html#custom-pages-parameters). ([#944](https://github.com/simonw/datasette/issues/944))\r\n- `register_output_renderer()` render functions can now return a `Response`. ([#953](https://github.com/simonw/datasette/issues/953))\r\n- New `--upgrade` option for `datasette install`. ([#945](https://github.com/simonw/datasette/issues/945))\r\n- New `datasette --pdb` option. ([#962](https://github.com/simonw/datasette/issues/962))\r\n- `datasette --get` exit code now reflects the internal HTTP status code. ([#947](https://github.com/simonw/datasette/issues/947))\r\n- New `raise_404()` template function for returning 404 errors. ([#964](https://github.com/simonw/datasette/issues/964))\r\n- `datasette publish heroku` now deploys using Python 3.8.5\r\n- Upgraded [CodeMirror](https://codemirror.net/) to 5.57.0. ([#948](https://github.com/simonw/datasette/issues/948))\r\n- Upgraded code style to Black 20.8b1. ([#958](https://github.com/simonw/datasette/issues/958))\r\n- Fixed bug where selected facets were not correctly persisted in hidden form fields on the table page. ([#963](https://github.com/simonw/datasette/issues/963))\r\n- Renamed the default error template from `500.html` to `error.html`.\r\n- Custom error pages are now documented, see [Custom error pages](https://docs.datasette.io/en/stable/custom_templates.html#custom-pages-errors). ([#965](https://github.com/simonw/datasette/issues/965))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.59a0", "id": 47461737, "node_id": "MDc6UmVsZWFzZTQ3NDYxNzM3", "tag_name": "0.59a0", "target_commitish": "main", "name": "0.59a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2021-08-07T05:40:07Z", "published_at": "2021-08-07T05:42:25Z", "body": "- [register_routes(datasette)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-register-routes) plugin hook now accepts an optional `datasette` argument. ([#1404](https://github.com/simonw/datasette/issues/1404))\r\n- New `hide_sql` canned query option for defaulting to hiding the SQL quey used by a canned query, see [Additional canned query options](https://docs.datasette.io/en/latest/sql_queries.html#canned-queries-options). ([#1422](https://github.com/simonw/datasette/issues/1422))\r\n- New `--cpu` option for [datasette publish cloudrun](https://docs.datasette.io/en/latest/publish.html#publish-cloud-run). ([#1420](https://github.com/simonw/datasette/issues/1420))\r\n- If [Rich](https://github.com/willmcgugan/rich) is installed in the same virtual environment as Datasette, it will be used to provide enhanced display of error tracebacks on the console. ([#1416](https://github.com/simonw/datasette/issues/1416))\r\n- `datasette.utils` [parse_metadata(content)](https://docs.datasette.io/en/latest/internals.html#internals-utils-parse-metadata) function, used by the new [datasette-remote-metadata plugin](https://datasette.io/plugins/datasette-remote-metadata), is now a documented API. ([#1405](https://github.com/simonw/datasette/issues/1405))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.17.1", "id": 50089123, "node_id": "RE_kwDOCGYnMM4C_Eyj", "tag_name": "3.17.1", "target_commitish": "main", "name": "3.17.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-09-22T20:49:36Z", "published_at": "2021-09-22T20:51:04Z", "body": "- [sqlite-utils memory](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-memory) now works if files passed to it share the same file name. ([#325](https://github.com/simonw/sqlite-utils/issues/325))\r\n- [sqlite-utils query](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-query) now returns `[]` in JSON mode if no rows are returned. ([#328](https://github.com/simonw/sqlite-utils/issues/328))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.16", "id": 29999731, "node_id": "MDc6UmVsZWFzZTI5OTk5NzMx", "tag_name": "2.16", "target_commitish": "main", "name": "2.16", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-21T21:02:29Z", "published_at": "2020-08-21T21:05:51Z", "body": "- `--load-extension` option for `sqlite-utils query` for loading SQLite extensions. ([#134](https://github.com/simonw/sqlite-utils/issues/134))\r\n- New `sqlite_utils.utils.find_spatialite()` function for finding SpatiaLite in common locations. ([#135](https://github.com/simonw/sqlite-utils/issues/135))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.16.1", "id": 30352225, "node_id": "MDc6UmVsZWFzZTMwMzUyMjI1", "tag_name": "2.16.1", "target_commitish": "main", "name": "2.16.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-28T22:45:11Z", "published_at": "2020-08-28T22:47:02Z", "body": "- `insert_all(..., alter=True)` now works for columns introduced after the first 100 records. Thanks, Simon Wiles! ([#139](https://github.com/simonw/sqlite-utils/issues/139))\r\n- Continuous Integration is now powered by GitHub Actions. ([#143](https://github.com/simonw/sqlite-utils/issues/143))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.49a0", "id": 30353073, "node_id": "MDc6UmVsZWFzZTMwMzUzMDcz", "tag_name": "0.49a0", "target_commitish": "main", "name": "0.49a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-08-28T23:12:47Z", "published_at": "2020-08-28T23:18:09Z", "body": "- `register_output_renderer()` render functions can now return a `Response`. ([#953](https://github.com/simonw/datasette/issues/953))\r\n- New `--upgrade` option for `datasette install`. ([#945](https://github.com/simonw/datasette/issues/945))\r\n- `datasette publish heroku` now deploys using Python 3.8.5", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.4", "id": 37437744, "node_id": "MDc6UmVsZWFzZTM3NDM3NzQ0", "tag_name": "3.4", "target_commitish": "main", "name": "3.4", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-02-06T01:37:27Z", "published_at": "2021-02-06T01:38:26Z", "body": "- `sqlite-utils insert --csv` now accepts optional `--delimiter` and `--quotechar` options. See [Alternative delimiters and quote characters](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv-delimiter). ([#223](https://github.com/simonw/sqlite-utils/issues/223))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.15", "id": 47569134, "node_id": "MDc6UmVsZWFzZTQ3NTY5MTM0", "tag_name": "3.15", "target_commitish": "main", "name": "3.15", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-08-09T22:42:06Z", "published_at": "2021-08-09T22:43:16Z", "body": "- `sqlite-utils insert --flatten` option for [flattening nested JSON objects](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-inserting-data-flatten) to create tables with column names like `topkey_nestedkey`. ([#310](https://github.com/simonw/sqlite-utils/issues/310))\r\n- Fixed several spelling mistakes in the documentation, spotted [using codespell](https://til.simonwillison.net/python/codespell).\r\n- Errors that occur while using the `sqlite-utils` CLI tool now show the responsible SQL and query parameters, if possible. ([#309](https://github.com/simonw/sqlite-utils/issues/309))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.5", "id": 38037267, "node_id": "MDc6UmVsZWFzZTM4MDM3MjY3", "tag_name": "3.5", "target_commitish": "main", "name": "3.5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-02-14T22:43:06Z", "published_at": "2021-02-14T22:44:21Z", "body": "- `sqlite-utils insert --sniff` option for detecting the delimiter and quote character used by a CSV file, see [Alternative delimiters and quote characters](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv-delimiter). ([#230](https://github.com/simonw/sqlite-utils/issues/230))\r\n- The `table.rows_where()`, `table.search()` and `table.search_sql()` methods all now take optional `offset=` and `limit=` arguments. ([#231](https://github.com/simonw/sqlite-utils/issues/231))\r\n- New `--no-headers` option for `sqlite-utils insert --csv` to handle CSV files that are missing the header row, see [CSV files without a header row](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv-no-header). ([#228](https://github.com/simonw/sqlite-utils/issues/228))\r\n- Fixed bug where inserting data with extra columns in subsequent chunks would throw an error. Thanks [@nieuwenhoven](https://github.com/nieuwenhoven) for the fix. ([#234](https://github.com/simonw/sqlite-utils/issues/234))\r\n- Fixed bug importing CSV files with columns containing more than 128KB of data. ([#229](https://github.com/simonw/sqlite-utils/issues/229))\r\n- Test suite now runs in CI against Ubuntu, macOS and Windows. Thanks [@nieuwenhoven](https://github.com/nieuwenhoven) for the Windows test fixes. ([#232](https://github.com/simonw/sqlite-utils/issues/232))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.20", "id": 56514583, "node_id": "RE_kwDOCGYnMM4DXlgX", "tag_name": "3.20", "target_commitish": "main", "name": "3.20", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2022-01-06T06:55:35Z", "published_at": "2022-01-06T06:57:09Z", "body": "- `sqlite-utils insert ... --lines` to insert the lines from a file into a table with a single `line` column, see [Inserting unstructured data with --lines and --text](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-unstructured).\r\n- `sqlite-utils insert ... --text` to insert the contents of the file into a table with a single `text` column and a single row.\r\n- `sqlite-utils insert ... --convert` allows a Python function to be provided that will be used to convert each row that is being inserted into the database. See [Applying conversions while inserting data](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-convert), including details on special behavior when combined with `--lines` and `--text`. ([#356](https://github.com/simonw/sqlite-utils/issues/356))\r\n- `sqlite-utils convert` now accepts a code value of `-` to read code from standard input. ([#353](https://github.com/simonw/sqlite-utils/issues/353))\r\n- `sqlite-utils convert` also now accepts code that defines a named `convert(value)` function, see [Converting data in columns](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert).\r\n- `db.supports_strict` property showing if the database connection supports [SQLite strict tables](https://www.sqlite.org/stricttables.html).\r\n- `table.strict` property (see [.strict](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-introspection-strict)) indicating if the table uses strict mode. ([#344](https://github.com/simonw/sqlite-utils/issues/344))\r\n- Fixed bug where `sqlite-utils upsert ... --detect-types` ignored the `--detect-types` option. ([#362](https://github.com/simonw/sqlite-utils/issues/362))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.13", "id": 46720847, "node_id": "MDc6UmVsZWFzZTQ2NzIwODQ3", "tag_name": "3.13", "target_commitish": "main", "name": "3.13", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-07-24T22:15:27Z", "published_at": "2021-07-24T22:17:47Z", "body": "- `sqlite-utils schema my.db table1 table2` command now accepts optional table names. ([#299](https://github.com/simonw/sqlite-utils/issues/299))\r\n- `sqlite-utils memory --help` now describes the `--schema` option.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.21", "id": 31773390, "node_id": "MDc6UmVsZWFzZTMxNzczMzkw", "tag_name": "2.21", "target_commitish": "main", "name": "2.21", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-09-24T16:44:30Z", "published_at": "2020-09-24T16:45:44Z", "body": "- `table.extract()` and `sqlite-utils extract` now apply much, much faster - one example operation reduced from twelve minutes to just four seconds! ([#172](https://github.com/simonw/sqlite-utils/issues/172))\r\n- `sqlite-utils extract` no longer shows a progress bar, because it's fast enough not to need one.\r\n- New `column_order=` option for `table.transform()` which can be used to alter the order of columns in a table. ([#175](https://github.com/simonw/sqlite-utils/issues/175))\r\n- `sqlite-utils transform --column-order=` option (with a `-o` shortcut) for changing column order. ([#176](https://github.com/simonw/sqlite-utils/issues/176))\r\n- The `table.transform(drop_foreign_keys=)` parameter and the `sqlite-utils transform --drop-foreign-key` option have changed. They now accept just the name of the column rather than requiring all three of the column, other table and other column. This is technically a backwards-incompatible change but I chose not to bump the major version number because the transform feature is so new. ([#177](https://github.com/simonw/sqlite-utils/issues/177))\r\n- The table `.disable_fts()`, `.rebuild_fts()`, `.delete()`, `.delete_where()` and `.add_missing_columns()` methods all now `return self`, which means they can be chained together with other table operations.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.23", "id": 33188958, "node_id": "MDc6UmVsZWFzZTMzMTg4OTU4", "tag_name": "2.23", "target_commitish": "main", "name": "2.23", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-10-28T21:38:10Z", "published_at": "2020-10-28T21:38:54Z", "body": "- `table.m2m(other_table, records)` method now takes any iterable, not just a list or tuple. Thanks, Adam Wolf. ([#189](https://github.com/simonw/sqlite-utils/pull/189))\r\n- `sqlite-utils insert` now displays a progress bar for CSV or TSV imports. ([#173](https://github.com/simonw/sqlite-utils/issues/173))\r\n- New `@db.register_function(deterministic=True)` option for registering deterministic SQLite functions in Python 3.8 or higher. ([#191](https://github.com/simonw/sqlite-utils/issues/191))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.18", "id": 30942758, "node_id": "MDc6UmVsZWFzZTMwOTQyNzU4", "tag_name": "2.18", "target_commitish": "main", "name": "2.18", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-09-08T23:37:28Z", "published_at": "2020-09-08T23:39:21Z", "body": "- `table.rebuild_fts()` method for rebuilding a FTS index, see [Rebuilding a full-text search table](https://sqlite-utils.readthedocs.io/en/stable/python-api.html#python-api-fts-rebuild). ([#155](https://github.com/simonw/sqlite-utils/issues/155))\r\n- `sqlite-utils rebuild-fts data.db` command for rebuilding FTS indexes across all tables, or just specific tables. ([#155](https://github.com/simonw/sqlite-utils/issues/155))\r\n- `table.optimize()` method no longer deletes junk rows from the `*_fts_docsize` table. This was added in 2.17 but it turns out running `table.rebuild_fts()` is a better solution to this problem.\r\n- Fixed a bug where rows with additional columns that are inserted after the first batch of records could cause an error due to breaking SQLite's maximum number of parameters. Thanks, Simon Wiles. ([#145](https://github.com/simonw/sqlite-utils/issues/145))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.58.1", "id": 46341814, "node_id": "MDc6UmVsZWFzZTQ2MzQxODE0", "tag_name": "0.58.1", "target_commitish": "main", "name": "0.58.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-07-16T19:50:06Z", "published_at": "2021-07-16T19:51:15Z", "body": "- Fix for an intermittent race condition caused by the `refresh_schemas()` internal function. ([#1231](https://github.com/simonw/datasette/issues/1231))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.13", "id": 21073645, "node_id": "MDc6UmVsZWFzZTIxMDczNjQ1", "tag_name": "0.13", "target_commitish": "master", "name": "0.13", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-30T02:20:09Z", "published_at": "2019-10-30T02:22:30Z", "body": "- New `mentions-timeline` command (#26)", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.64.3", "id": 101136455, "node_id": "RE_kwDOBm6k_c4GBzhH", "tag_name": "0.64.3", "target_commitish": "0.64.x", "name": "0.64.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2023-04-27T14:55:25Z", "published_at": "2023-04-27T15:00:27Z", "body": "- Added `pip` and `setuptools` as explicit dependencies. This fixes a bug where Datasette could not be installed using [Rye](https://github.com/mitsuhiko/rye). ([#2065](https://github.com/simonw/datasette/issues/2065))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/releases/101136455/reactions\", \"total_count\": 3, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 2, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}"} {"html_url": "https://github.com/dogsheep/dogsheep-beta/releases/tag/0.4a1", "id": 30678449, "node_id": "MDc6UmVsZWFzZTMwNjc4NDQ5", "tag_name": "0.4a1", "target_commitish": "main", "name": "0.4a1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-09-03T18:03:15Z", "published_at": "2020-09-03T18:03:50Z", "body": "- Added `received` category. #10\r\n- New `is_public` column. #11", "repo": {"value": 197431109, "label": "dogsheep-beta"}, "reactions": null} {"html_url": "https://github.com/dogsheep/dogsheep-beta/releases/tag/0.9a0", "id": 31582397, "node_id": "MDc6UmVsZWFzZTMxNTgyMzk3", "tag_name": "0.9a0", "target_commitish": "main", "name": "0.9a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-09-20T23:37:09Z", "published_at": "2020-09-20T23:37:48Z", "body": "- Added by date, as part of developing a timeline view. #16", "repo": {"value": 197431109, "label": "dogsheep-beta"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.21.2", "id": 28705982, "node_id": "MDc6UmVsZWFzZTI4NzA1OTgy", "tag_name": "0.21.2", "target_commitish": "master", "name": "0.21.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-07-18T22:42:54Z", "published_at": "2020-07-18T22:43:20Z", "body": "- Added changelog badge", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.59.2", "id": 53323406, "node_id": "RE_kwDOBm6k_c4DLaaO", "tag_name": "0.59.2", "target_commitish": "main", "name": "0.59.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-11-14T05:37:40Z", "published_at": "2021-11-14T05:43:09Z", "body": "- Column names with a leading underscore now work correctly when used as a facet. ([#1506](https://github.com/simonw/datasette/issues/1506))\r\n- Applying `?_nocol=` to a column no longer removes that column from the filtering interface. ([#1503](https://github.com/simonw/datasette/issues/1503))\r\n- Official Datasette Docker container now uses Debian Bullseye as the base image. ([#1497](https://github.com/simonw/datasette/issues/1497))\r\n- Datasette is four years old today! Here's the [original release announcement](https://simonwillison.net/2017/Nov/13/datasette/) from 2017.", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/dogsheep/evernote-to-sqlite/releases/tag/0.3", "id": 37946829, "node_id": "MDc6UmVsZWFzZTM3OTQ2ODI5", "tag_name": "0.3", "target_commitish": "main", "name": "0.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-02-11T22:14:01Z", "published_at": "2021-02-11T22:16:20Z", "body": "- Correctly handle entities in XHTML notes. [#9](https://github.com/dogsheep/evernote-to-sqlite/issues/9)\r\n- Fixed a bug importing ENEX files on Windows. Thanks, [dskrad](https://github.com/dskrad). [#11](https://github.com/dogsheep/evernote-to-sqlite/issues/11)\r\n", "repo": {"value": 303218369, "label": "evernote-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/dogsheep-beta/releases/tag/0.5", "id": 30699190, "node_id": "MDc6UmVsZWFzZTMwNjk5MTkw", "tag_name": "0.5", "target_commitish": "main", "name": "0.5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-09-04T01:45:35Z", "published_at": "2020-09-04T01:46:16Z", "body": "- Custom template displays can now render a point on a map. #12", "repo": {"value": 197431109, "label": "dogsheep-beta"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.64", "id": 88331580, "node_id": "RE_kwDOBm6k_c4FQ9U8", "tag_name": "0.64", "target_commitish": "0.63.x", "name": "0.64", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2023-01-09T16:37:21Z", "published_at": "2023-01-09T16:49:04Z", "body": "- Datasette now **strongly recommends against allowing arbitrary SQL queries if you are using SpatiaLite**. SpatiaLite includes SQL functions that could cause the Datasette server to crash. See [SpatiaLite](https://docs.datasette.io/en/stable/spatialite.html#spatialite) for more details.\r\n- New [default_allow_sql](https://docs.datasette.io/en/stable/settings.html#setting-default-allow-sql) setting, providing an easier way to disable all arbitrary SQL execution by end users: `datasette --setting default_allow_sql off`. See also [Controlling the ability to execute arbitrary SQL](https://docs.datasette.io/en/stable/authentication.html#authentication-permissions-execute-sql). ([#1409](https://github.com/simonw/datasette/issues/1409))\r\n- [Building a location to time zone API with SpatiaLite](https://datasette.io/tutorials/spatialite) is a new Datasette tutorial showing how to safely use SpatiaLite to create a location to time zone API.\r\n- New documentation about [how to debug problems loading SQLite extensions](https://docs.datasette.io/en/stable/installation.html#installation-extensions). The error message shown when an extension cannot be loaded has also been improved. ([#1979](https://github.com/simonw/datasette/issues/1979))\r\n- Fixed an accessibility issue: the `