` element, to help with advanced CSS customization. ([#1446](https://github.com/simonw/datasette/issues/1446))",107914493,
https://github.com/dogsheep/evernote-to-sqlite/releases/tag/0.3.2,48523966,MDc6UmVsZWFzZTQ4NTIzOTY2,0.3.2,main,0.3.2,0,9599,0,2021-08-26T19:01:49Z,2021-08-26T19:02:47Z,- Fixed error when encountering `
` documents that were not well-formed XML. [#13](https://github.com/dogsheep/evernote-to-sqlite/issues/13),303218369,
https://github.com/simonw/sqlite-utils/releases/tag/3.17,48389722,MDc6UmVsZWFzZTQ4Mzg5NzIy,3.17,main,3.17,0,9599,0,2021-08-24T23:40:18Z,2021-08-24T23:42:22Z,"- 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))
- [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))",140912432,"{""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}"
https://github.com/dogsheep/healthkit-to-sqlite/releases/tag/1.0.1,48151477,MDc6UmVsZWFzZTQ4MTUxNDc3,1.0.1,main,1.0.1,0,9599,0,2021-08-20T00:55:29Z,2021-08-20T00:56:17Z,- Fixed bug where `activity_summary` table could fail to be built with an error. [#19](https://github.com/dogsheep/healthkit-to-sqlite/issues/19),197882382,
https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.21.4,48150315,MDc6UmVsZWFzZTQ4MTUwMzE1,0.21.4,main,0.21.4,0,9599,0,2021-08-20T00:14:08Z,2021-08-20T00:14:30Z,"- Fix for `since_id` error with `user-timeline`. [#57](https://github.com/dogsheep/twitter-to-sqlite/issues/57)
- Document the use of `--stop_after` with favorites - thanks, Mike Lee Williams. [#49](https://github.com/dogsheep/twitter-to-sqlite/pull/49)
- Fixes for Twitter archive imports, thanks Jacob Kaplan-Moss. [#55](https://github.com/dogsheep/twitter-to-sqlite/pull/55)
",206156866,
https://github.com/simonw/sqlite-utils/releases/tag/3.16,48077246,MDc6UmVsZWFzZTQ4MDc3MjQ2,3.16,main,3.16,0,9599,0,2021-08-18T22:36:32Z,2021-08-18T22:37:55Z,"- 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))
- 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))
- `table.search()` now accepts an optional `quote=True` parameter. ([#296](https://github.com/simonw/sqlite-utils/issues/296))
- CLI command `sqlite-utils search` now accepts a `--quote` option. ([#296](https://github.com/simonw/sqlite-utils/issues/296))
- 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))
- Various small improvements to [API reference](https://sqlite-utils.datasette.io/en/stable/reference.html#reference) documentation.",140912432,
https://github.com/simonw/sqlite-utils/releases/tag/3.15.1,47636109,MDc6UmVsZWFzZTQ3NjM2MTA5,3.15.1,main,3.15.1,0,9599,0,2021-08-10T23:55:12Z,2021-08-10T23:55:38Z,"- 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))
- New [API Reference](https://sqlite-utils.datasette.io/en/stable/reference.html) documentation page, powered by those docstrings.
- 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))
- 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))",140912432,"{""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}"
https://github.com/simonw/sqlite-utils/releases/tag/3.15,47569134,MDc6UmVsZWFzZTQ3NTY5MTM0,3.15,main,3.15,0,9599,0,2021-08-09T22:42:06Z,2021-08-09T22:43:16Z,"- `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))
- Fixed several spelling mistakes in the documentation, spotted [using codespell](https://til.simonwillison.net/python/codespell).
- 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))",140912432,
https://github.com/simonw/datasette/releases/tag/0.59a1,47507174,MDc6UmVsZWFzZTQ3NTA3MTc0,0.59a1,main,0.59a1,0,9599,1,2021-08-09T01:13:03Z,2021-08-09T01:14:06Z,- 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)),107914493,"{""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}"
https://github.com/simonw/datasette/releases/tag/0.59a0,47461737,MDc6UmVsZWFzZTQ3NDYxNzM3,0.59a0,main,0.59a0,0,9599,1,2021-08-07T05:40:07Z,2021-08-07T05:42:25Z,"- [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))
- 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))
- 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))
- 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))
- `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))",107914493,
https://github.com/simonw/sqlite-utils/releases/tag/3.14,47185841,MDc6UmVsZWFzZTQ3MTg1ODQx,3.14,main,3.14,0,9599,0,2021-08-02T21:29:16Z,2021-08-02T21:34:43Z,"This release introduces the new [sqlite-utils convert command](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert) ([#251](https://github.com/simonw/sqlite-utils/issues/251)) and corresponding [table.convert(...)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-convert) Python method ([#302](https://github.com/simonw/sqlite-utils/issues/302)). These tools can be used to apply a Python conversion function to one or more columns of a table, either updating the column in place or using transformed data from that column to populate one or more other columns.
This command-line example uses the Python standard library [textwrap module](https://docs.python.org/3/library/textwrap.html) to wrap the content of the `content` column in the `articles` table to 100 characters:
```
$ sqlite-utils convert content.db articles content\
'""\n"".join(textwrap.wrap(value, 100))'\
--import=textwrap
```
The same operation in Python code looks like this:
```python
import sqlite_utils, textwrap
db = sqlite_utils.Database(""content.db"")
db[""articles""].convert(""content"", lambda v: ""\n"".join(textwrap.wrap(v, 100)))
```
See the full documentation for the [sqlite-utils convert command](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-convert) and the [table.convert(...)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-convert) Python method for more details.
Also in this release:
- The new `table.count_where(...)` method, for counting rows in a table that match a specific SQL `WHERE` clause. ([#305](https://github.com/simonw/sqlite-utils/issues/305))
- New `--silent` option for the [sqlite-utils insert-files command](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-files) to hide the terminal progress bar, consistent with the `--silent` option for `sqlite-utils convert`. ([#301](https://github.com/simonw/sqlite-utils/issues/301))",140912432,
https://github.com/simonw/sqlite-utils/releases/tag/3.13,46720847,MDc6UmVsZWFzZTQ2NzIwODQ3,3.13,main,3.13,0,9599,0,2021-07-24T22:15:27Z,2021-07-24T22:17:47Z,"- `sqlite-utils schema my.db table1 table2` command now accepts optional table names. ([#299](https://github.com/simonw/sqlite-utils/issues/299))
- `sqlite-utils memory --help` now describes the `--schema` option.",140912432,
https://github.com/simonw/datasette/releases/tag/0.58.1,46341814,MDc6UmVsZWFzZTQ2MzQxODE0,0.58.1,main,0.58.1,0,9599,0,2021-07-16T19:50:06Z,2021-07-16T19:51:15Z,- Fix for an intermittent race condition caused by the `refresh_schemas()` internal function. ([#1231](https://github.com/simonw/datasette/issues/1231)),107914493,
https://github.com/simonw/datasette/releases/tag/0.58,46222036,MDc6UmVsZWFzZTQ2MjIyMDM2,0.58,main,0.58,0,9599,0,2021-07-15T00:33:04Z,2021-07-15T00:37:57Z,"- New `datasette --uds /tmp/datasette.sock` option for binding Datasette to a Unix domain socket, see [proxy documentation](https://docs.datasette.io/en/stable/deploying.html#deploying-proxy). ([#1388](https://github.com/simonw/datasette/issues/1388))
- `""searchmode"": ""raw""` table metadata option for defaulting a table to executing SQLite full-text search syntax without first escaping it, see [Advanced SQLite search queries](https://docs.datasette.io/en/stable/full_text_search.html#full-text-search-advanced-queries). ([#1389](https://github.com/simonw/datasette/issues/1389))
- New plugin hook: [get_metadata(datasette, key, database, table)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-get-metadata), for returning custom metadata for an instance, database or table. Thanks, Brandon Roberts! ([#1384](https://github.com/simonw/datasette/issues/1384))
- New plugin hook: [skip_csrf(datasette, scope)](https://docs.datasette.io/en/stable/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))
- The [menu_links()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-menu-links), [table_actions()](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-table-actions) and [database_actions()](https://docs.datasette.io/en/stable/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))
- Major performance improvement for Datasette faceting. ([#1394](https://github.com/simonw/datasette/issues/1394))
- Improved documentation for [Running Datasette behind a proxy](https://docs.datasette.io/en/stable/deploying.html#deploying-proxy) to recommend using `ProxyPreservehost On` with Apache. ([#1387](https://github.com/simonw/datasette/issues/1387))
- `POST` requests to endpoints that do not support that HTTP verb now return a 405 error.
- `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))",107914493,
https://github.com/simonw/sqlite-utils/releases/tag/3.12,45251624,MDc6UmVsZWFzZTQ1MjUxNjI0,3.12,main,3.12,0,9599,0,2021-06-25T17:59:05Z,2021-06-25T18:00:18Z,"- 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))
- This project now uses `flake8` and has started to use `mypy`. ([#291](https://github.com/simonw/sqlite-utils/issues/291))
- 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))",140912432,
https://github.com/simonw/datasette/releases/tag/0.58a1,45182156,MDc6UmVsZWFzZTQ1MTgyMTU2,0.58a1,main,0.58a1,0,9599,1,2021-06-24T16:24:59Z,2021-06-24T16:29:09Z,"- 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))
- `POST` requests to endpoints that do not support that HTTP verb now return a 405 error.
- `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))",107914493,"{""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}"
https://github.com/simonw/sqlite-utils/releases/tag/3.11,44927292,MDc6UmVsZWFzZTQ0OTI3Mjky,3.11,main,3.11,0,9599,0,2021-06-20T18:52:15Z,2021-06-20T18:53:09Z,"- 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))
- Added [installation instructions](https://sqlite-utils.datasette.io/en/stable/installation.html#installation). ([#286](https://github.com/simonw/sqlite-utils/issues/286))",140912432,
https://github.com/simonw/sqlite-utils/releases/tag/3.10,44904928,MDc6UmVsZWFzZTQ0OTA0OTI4,3.10,main,3.10,0,9599,0,2021-06-19T16:09:29Z,2021-06-19T16:13:11Z,"This release introduces the `sqlite-utils memory` command, which can be used to load CSV or JSON data into a temporary in-memory database and run SQL queries (including joins across multiple files) directly against that data.
Also new: `sqlite-utils insert --detect-types`, `sqlite-utils dump`, `table.use_rowid` plus some smaller fixes.
### sqlite-utils memory
This example of `sqlite-utils memory` retrieves information about the all of the repositories in the [Dogsheep](https://github.com/dogsheep) organization on GitHub using [this JSON API](https://api.github.com/users/dogsheep/repos), sorts them by their number of stars and outputs a table of the top five (using `-t`):
```
$ curl -s 'https://api.github.com/users/dogsheep/repos'\
| sqlite-utils memory - '
select full_name, forks_count, stargazers_count
from stdin order by stargazers_count desc limit 5
' -t
full_name forks_count stargazers_count
--------------------------------- ------------- ------------------
dogsheep/twitter-to-sqlite 12 225
dogsheep/github-to-sqlite 14 139
dogsheep/dogsheep-photos 5 116
dogsheep/dogsheep.github.io 7 90
dogsheep/healthkit-to-sqlite 4 85
```
The tool works against files on disk as well. This example joins data from two CSV files:
```
$ cat creatures.csv
species_id,name
1,Cleo
2,Bants
2,Dori
2,Azi
$ cat species.csv
id,species_name
1,Dog
2,Chicken
$ sqlite-utils memory species.csv creatures.csv '
select * from creatures join species on creatures.species_id = species.id
'
[{""species_id"": 1, ""name"": ""Cleo"", ""id"": 1, ""species_name"": ""Dog""},
{""species_id"": 2, ""name"": ""Bants"", ""id"": 2, ""species_name"": ""Chicken""},
{""species_id"": 2, ""name"": ""Dori"", ""id"": 2, ""species_name"": ""Chicken""},
{""species_id"": 2, ""name"": ""Azi"", ""id"": 2, ""species_name"": ""Chicken""}]
```
Here the `species.csv` file becomes the `species` table, the `creatures.csv` file becomes the `creatures` table and the output is JSON, the default output format.
You can also use the `--attach` option to attach existing SQLite database files to the in-memory database, in order to join data from CSV or JSON directly against your existing tables.
Full documentation of this new feature is available in [Querying data directly using an in-memory database](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-memory). ([#272](https://github.com/simonw/sqlite-utils/issues/272))
### sqlite-utils insert --detect-types
The [sqlite-utils insert](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-inserting-data) command can be used to insert data from JSON, CSV or TSV files into a SQLite database file. The new `--detect-types` option (shortcut `-d`), when used in conjunction with a CSV or TSV import, will automatically detect if columns in the file are integers or floating point numbers as opposed to treating everything as a text column and create the new table with the corresponding schema. See [Inserting CSV or TSV data](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-insert-csv-tsv) for details. ([#282](https://github.com/simonw/sqlite-utils/issues/282))
### Other changes
- **Bug fix**: `table.transform()`, when run against a table without explicit primary keys, would incorrectly create a new version of the table with an explicit primary key column called `rowid`. ([#284](https://github.com/simonw/sqlite-utils/issues/284))
- New `table.use_rowid` introspection property, see [.use_rowid](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-introspection-use-rowid). ([#285](https://github.com/simonw/sqlite-utils/issues/285))
- The new `sqlite-utils dump file.db` command outputs a SQL dump that can be used to recreate a database. ([#274](https://github.com/simonw/sqlite-utils/issues/274))
- `-h` now works as a shortcut for `--help`, thanks Loren McIntyre. ([#276](https://github.com/simonw/sqlite-utils/issues/276))
- Now using [pytest-cov](https://pytest-cov.readthedocs.io/) and [Codecov](https://about.codecov.io/) to track test coverage - currently at 96%. ([#275](https://github.com/simonw/sqlite-utils/issues/275))
- SQL errors that occur when using `sqlite-utils query` are now displayed as CLI errors.",140912432,"{""url"": ""https://api.github.com/repos/simonw/sqlite-utils/releases/44904928/reactions"", ""total_count"": 3, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 1, ""eyes"": 1}"
https://github.com/dogsheep/dogsheep-beta/releases/tag/0.10.2,44537329,MDc6UmVsZWFzZTQ0NTM3MzI5,0.10.2,main,0.10.2,0,9599,0,2021-06-13T14:37:17Z,2021-06-13T14:38:09Z,- Fixed bug where searches consisting only of whitespace caused a server error. [#33](https://github.com/dogsheep/dogsheep-beta/issues/33),197431109,
https://github.com/simonw/sqlite-utils/releases/tag/3.9.1,44529219,MDc6UmVsZWFzZTQ0NTI5MjE5,3.9.1,main,3.9.1,0,9599,0,2021-06-13T02:59:08Z,2021-06-13T03:00:45Z,- Fixed bug when using `table.upsert_all()` to create a table with only a single column that is treated as the primary key. ([#271](https://github.com/simonw/sqlite-utils/issues/271)),140912432,
https://github.com/simonw/sqlite-utils/releases/tag/3.9,44511190,MDc6UmVsZWFzZTQ0NTExMTkw,3.9,main,3.9,0,9599,0,2021-06-12T02:07:18Z,2021-06-12T02:08:03Z,"- 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))
- `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).",140912432,"{""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}"
https://github.com/simonw/datasette/releases/tag/0.58a0,44388485,MDc6UmVsZWFzZTQ0Mzg4NDg1,0.58a0,main,0.58a0,0,9599,1,2021-06-10T04:51:14Z,2021-06-10T04:52:45Z,"- 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))",107914493,
https://github.com/simonw/datasette/releases/tag/0.57.1,44292523,MDc6UmVsZWFzZTQ0MjkyNTIz,0.57.1,main,0.57.1,0,9599,0,2021-06-08T16:26:45Z,2021-06-08T16:28:31Z,"- Fixed visual display glitch with global navigation menu. ([#1367](https://github.com/simonw/datasette/issues/1367))
- No longer truncates the list of table columns displayed on the `/database` page. ([#1364](https://github.com/simonw/datasette/issues/1364))",107914493,"{""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}"
https://github.com/simonw/datasette/releases/tag/0.57,44155601,MDc6UmVsZWFzZTQ0MTU1NjAx,0.57,main,0.57,0,9599,0,2021-06-05T22:06:55Z,2021-06-05T22:11:18Z,"**Warning**: This release fixes a [reflected cross-site scripting](https://owasp.org/www-community/attacks/xss/#reflected-xss-attacks) security hole with the `?_trace=1` feature. You should upgrade to this version, or to Datasette 0.56.1, as soon as possible. ([#1360](https://github.com/simonw/datasette/issues/1360))
In addition to the security fix, this release includes `?_col=` and `?_nocol=` options for controlling which columns are displayed for a table, `?_facet_size=` for increasing the number of facet results returned, re-display of your SQL query should an error occur and numerous bug fixes.
### New features
- If an error occurs while executing a user-provided SQL query, that query is now re-displayed in an editable form along with the error message. ([#619](https://github.com/simonw/datasette/issues/619))
- New `?_col=` and `?_nocol=` parameters to show and hide columns in a table, plus an interface for hiding and showing columns in the column cog menu. ([#615](https://github.com/simonw/datasette/issues/615))
- A new `?_facet_size=` parameter for customizing the number of facet results returned on a table or view page. ([#1332](https://github.com/simonw/datasette/issues/1332))
- `?_facet_size=max` sets that to the maximum, which defaults to 1,000 and is controlled by the the [max_returned_rows](https://docs.datasette.io/en/stable/settings.html#setting-max-returned-rows) setting. If facet results are truncated the ... at the bottom of the facet list now links to this parameter. ([#1337](https://github.com/simonw/datasette/issues/1337))
- `?_nofacet=1` option to disable all facet calculations on a page, used as a performance optimization for CSV exports and `?_shape=array/object`. ([#1349](https://github.com/simonw/datasette/issues/1349), [#263](https://github.com/simonw/datasette/issues/263))
- `?_nocount=1` option to disable full query result counts. ([#1353](https://github.com/simonw/datasette/issues/1353))
- `?_trace=1` debugging option is now controlled by the new [trace_debug](https://docs.datasette.io/en/stable/settings.html#setting-trace-debug) setting, which is turned off by default. ([#1359](https://github.com/simonw/datasette/issues/1359))
### Bug fixes and other improvements
- [Custom pages](https://docs.datasette.io/en/stable/custom_templates.html#custom-pages) now work correctly when combined with the [base_url](https://docs.datasette.io/en/stable/settings.html#setting-base-url) setting. ([#1238](https://github.com/simonw/datasette/issues/1238))
- Fixed intermittent error displaying the index page when the user did not have permission to access one of the tables. Thanks, Guy Freeman. ([#1305](https://github.com/simonw/datasette/issues/1305))
- Columns with the name ""Link"" are no longer incorrectly displayed in bold. ([#1308](https://github.com/simonw/datasette/issues/1308))
- Fixed error caused by tables with a single quote in their names. ([#1257](https://github.com/simonw/datasette/issues/1257))
- Updated dependencies: `pytest-asyncio`, `Black`, `jinja2`, `aiofiles`, `click`, and `itsdangerous`.
- The official Datasette Docker image now supports `apt-get install`. ([#1320](https://github.com/simonw/datasette/issues/1320))
- The Heroku runtime used by `datasette publish heroku` is now `python-3.8.10`.",107914493,"{""url"": ""https://api.github.com/repos/simonw/datasette/releases/44155601/reactions"", ""total_count"": 1, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 1, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}"
https://github.com/simonw/datasette/releases/tag/0.56.1,44155459,MDc6UmVsZWFzZTQ0MTU1NDU5,0.56.1,0.56.x,0.56.1,0,9599,0,2021-06-05T21:54:47Z,2021-06-05T22:00:01Z,- Fix for a security hole: [reflected cross-site scripting](https://owasp.org/www-community/attacks/xss/#reflected-xss-attacks) in the `?_trace=1` feature. [#1360](https://github.com/simonw/datasette/issues/1360),107914493,
https://github.com/simonw/sqlite-utils/releases/tag/3.8,44019361,MDc6UmVsZWFzZTQ0MDE5MzYx,3.8,main,3.8,0,9599,0,2021-06-03T05:16:33Z,2021-06-03T05:17:33Z,"- 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))
- `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))",140912432,
https://github.com/simonw/sqlite-utils/releases/tag/3.0,33615120,MDc6UmVsZWFzZTMzNjE1MTIw,3.0,main,3.0,0,9599,0,2020-11-08T17:23:38Z,2020-11-08T17:24:27Z,"This release introduces a new `sqlite-utils search` command for searching tables, see [Executing searches](https://sqlite-utils.readthedocs.io/en/latest/cli.html#cli-search). ([#192](https://github.com/simonw/sqlite-utils/issues/192))
The `table.search()` method has been redesigned, see [Searching with table.search()](https://sqlite-utils.readthedocs.io/en/latest/python-api.html#python-api-fts-search). ([#197](https://github.com/simonw/sqlite-utils/issues/197))
The release includes minor backwards-incompatible changes, hence the version bump to 3.0. Those changes, which should not affect most users, are:
- The `-c` shortcut option for outputting CSV is no longer available. The full `--csv` option is required instead.
- The `-f` shortcut for `--fmt` has also been removed - use `--fmt`.
- The `table.search()` method now defaults to sorting by relevance, not sorting by `rowid`. ([#198](https://github.com/simonw/sqlite-utils/issues/198))
- The `table.search()` method now returns a generator over a list of Python dictionaries. It previously returned a list of tuples.
Also in this release:
- The `query`, `tables`, `rows` and `search` CLI commands now accept a new `--tsv` option which outputs the results in TSV. ([#193](https://github.com/simonw/sqlite-utils/issues/193))
- A new `table.virtual_table_using` property reveals if a table is a virtual table, and returns the upper case type of virtual table (e.g. `FTS4` or `FTS5`) if it is. It returns `None` if the table is not a virtual table. ([#196](https://github.com/simonw/sqlite-utils/issues/196))
- The new `table.search_sql()` method returns the SQL for searching a table, see [Building SQL queries with table.search_sql()](https://sqlite-utils.readthedocs.io/en/latest/python-api.html#python-api-fts-search-sql).
- `sqlite-utils rows` now accepts multiple optional `-c` parameters specifying the columns to return. ([#200](https://github.com/simonw/sqlite-utils/issues/200))
Changes since the 3.0a0 alpha release:
- The `sqlite-utils search` command now defaults to returning every result, unless you add a `--limit 20` option.
- The `sqlite-utils search -c` and `table.search(columns=[])` options are now fully respected. ([#201](https://github.com/simonw/sqlite-utils/issues/201))",140912432,
https://github.com/simonw/sqlite-utils/releases/tag/3.0a0,33591216,MDc6UmVsZWFzZTMzNTkxMjE2,3.0a0,main,3.0a0,0,9599,1,2020-11-07T01:22:24Z,2020-11-07T01:24:43Z,"This release introduces a new `sqlite-utils search` command for searching tables, see [Executing searches](https://sqlite-utils.readthedocs.io/en/latest/cli.html#cli-search). ([#192](https://github.com/simonw/sqlite-utils/issues/192))
The `table.search()` method has been redesigned, see [Searching with table.search()](https://sqlite-utils.readthedocs.io/en/latest/python-api.html#python-api-fts-search). ([#197](https://github.com/simonw/sqlite-utils/issues/197))
The release includes minor backwards-incompatible changes, hence the version bump to 3.0. Those changes, which should not affect most users, are:
- The `-c` shortcut option for outputting CSV is no longer available. The full `--csv` option is required instead.
- The `-f` shortcut for `--fmt` has also been removed - use `--fmt`.
- The `table.search()` method now defaults to sorting by relevance, not sorting by `rowid`. ([#198](https://github.com/simonw/sqlite-utils/issues/198))
- The `table.search()` method now returns a generator over a list of Python dictionaries. It previously returned a list of tuples.
Also in this release:
- The `query`, `tables`, `rows` and `search` CLI commands now accept a new `--tsv` option which outputs the results in TSV. ([#193](https://github.com/simonw/sqlite-utils/issues/193))
- A new `table.virtual_table_using` property reveals if a table is a virtual table, and returns the upper case type of virtual table (e.g. `FTS4` or `FTS5`) if it is. It returns `None` if the table is not a virtual table. ([#196](https://github.com/simonw/sqlite-utils/issues/196))
- The new `table.search_sql()` method returns the SQL for searching a table, see [Building SQL queries with table.search_sql()](https://sqlite-utils.readthedocs.io/en/latest/python-api.html#python-api-fts-search-sql).
- `sqlite-utils rows` now accepts multiple optional `-c` parameters specifying the columns to return. ([#200](https://github.com/simonw/sqlite-utils/issues/200))",140912432,
https://github.com/simonw/datasette/releases/tag/0.51,33311677,MDc6UmVsZWFzZTMzMzExNjc3,0.51,main,0.51,0,9599,0,2020-10-31T22:24:54Z,2020-10-31T22:29:33Z,"A new visual design, plugin hooks for adding navigation options, better handling of binary data, URL building utility methods and better support for running Datasette behind a proxy.
### New visual design
Datasette is no longer white and grey with blue and purple links! [Natalie Downe](https://twitter.com/natbat) has been working on a visual refresh, the first iteration of which is included in this release. ([#1056](https://github.com/simonw/datasette/pull/1056))
![datasette-0 51](https://user-images.githubusercontent.com/9599/97791267-d9011e80-1b8d-11eb-9b1b-42908266f36f.png)
### Plugins can now add links within Datasette
A number of existing Datasette plugins add new pages to the Datasette interface, providig tools for things like [uploading CSVs](https://github.com/simonw/datasette-upload-csvs), [editing table schemas](https://github.com/simonw/datasette-edit-schema) or [configuring full-text search](https://github.com/simonw/datasette-configure-fts).
Plugins like this can now link to themselves from other parts of Datasette interface. The [menu_links(datasette, actor)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-menu-links) hook ([#1064](https://github.com/simonw/datasette/issues/1064)) lets plugins add links to Datasette's new top-right application menu, and the [table_actions(datasette, actor, database, table)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-table-actions) hook ([#1066](https://github.com/simonw/datasette/issues/1066)) adds links to a new ""table actions"" menu on the table page.
The demo at [latest.datasette.io](https://latest.datasette.io/) now includes some example plugins. To see the new table actions menu first [sign into that demo as root](https://latest.datasette.io/login-as-root) and then visit the [facetable](https://latest.datasette.io/fixtures/facetable) table to see the new cog icon menu at the top of the page.
### Binary data
SQLite tables can contain binary data in `BLOB` columns. Datasette now provides links for users to download this data directly from Datasette, and uses those links to make binary data available from CSV exports. See [Binary data](https://docs.datasette.io/en/stable/binary_data.html#binary) for more details. ([#1036](https://github.com/simonw/datasette/issues/1036) and [#1034](https://github.com/simonw/datasette/issues/1034)).
### URL building
The new [datasette.urls](https://docs.datasette.io/en/stable/internals.html#internals-datasette-urls) family of methods can be used to generate URLs to key pages within the Datasette interface, both within custom templates and Datasette plugins. See [Building URLs within plugins](https://docs.datasette.io/en/stable/writing_plugins.html#writing-plugins-building-urls) for more details. ([#904](https://github.com/simonw/datasette/issues/904))
### Running Datasette behind a proxy
The [base_url](https://docs.datasette.io/en/stable/config.html#config-base-url) configuration option is designed to help run Datasette on a specific path behind a proxy - for example if you want to run an instance of Datasette at `/my-datasette/` within your existing site's URL hierarchy, proxied behind nginx or Apache.
Support for this configuration option has been greatly improved ([#1023](https://github.com/simonw/datasette/issues/1023)), and guidelines for using it are now available in a new documentation section on [Running Datasette behind a proxy](https://docs.datasette.io/en/stable/deploying.html#deploying-proxy). ([#1027](https://github.com/simonw/datasette/issues/1027))
### Smaller changes
- Wide tables shown within Datasette now scroll horizontally ([#998](https://github.com/simonw/datasette/issues/998)). This is achieved using a new `` element which may impact the implementation of some plugins (for example [this change to datasette-cluster-map](https://github.com/simonw/datasette-cluster-map/commit/fcb4abbe7df9071c5ab57defd39147de7145b34e)).
- New [debug-menu](https://docs.datasette.io/en/stable/authentication.html#permissions-debug-menu) permission. ([#1068](https://github.com/simonw/datasette/issues/1068))
- Removed `--debug` option, which didn't do anything. ([#814](https://github.com/simonw/datasette/issues/814))
- `Link:` HTTP header pagination. ([#1014](https://github.com/simonw/datasette/issues/1014))
- `x` button for clearing filters. ([#1016](https://github.com/simonw/datasette/issues/1016))
- Edit SQL button on canned queries, ([#1019](https://github.com/simonw/datasette/issues/1019))
- `--load-extension=spatialite` shortcut. ([#1028](https://github.com/simonw/datasette/issues/1028))
- scale-in animation for column action menu. ([#1039](https://github.com/simonw/datasette/issues/1039))
- Option to pass a list of templates to `.render_template()` is now documented. ([#1045](https://github.com/simonw/datasette/issues/1045))
- New `datasette.urls.static_plugins()` method. ([#1033](https://github.com/simonw/datasette/issues/1033))
- `datasette -o` option now opens the most relevant page. ([#976](https://github.com/simonw/datasette/issues/976))
- `datasette --cors` option now enables access to `/database.db` downloads. ([#1057](https://github.com/simonw/datasette/issues/1057))
- Database file downloads now implement cascading permissions, so you can download a database if you have `view-database-download` permission even if you do not have permission to access the Datasette instance. ([#1058](https://github.com/simonw/datasette/issues/1058))
- New documentation on [Designing URLs for your plugin](https://docs.datasette.io/en/stable/writing_plugins.html#writing-plugins-designing-urls). ([#1053](https://github.com/simonw/datasette/issues/1053))",107914493,
https://github.com/simonw/datasette/releases/tag/0.51.1,33314301,MDc6UmVsZWFzZTMzMzE0MzAx,0.51.1,main,0.51.1,0,9599,0,2020-11-01T03:33:47Z,2020-11-01T03:34:36Z,- Improvements to the new [Binary data](https://docs.datasette.io/en/stable/binary_data.html#binary) documentation page.,107914493,
https://github.com/simonw/datasette/releases/tag/0.51a2,33284522,MDc6UmVsZWFzZTMzMjg0NTIy,0.51a2,main,0.51a2,0,9599,1,2020-10-30T17:56:02Z,2020-10-30T17:57:53Z,"- 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))
- New [debug-menu](https://docs.datasette.io/en/latest/authentication.html#permissions-debug-menu) permission. ([#1068](https://github.com/simonw/datasette/issues/1068))",107914493,
https://github.com/simonw/datasette/releases/tag/0.51a1,33253780,MDc6UmVsZWFzZTMzMjUzNzgw,0.51a1,main,0.51a1,0,9599,1,2020-10-30T05:35:23Z,2020-10-30T05:37:34Z,"- New colour scheme and improved visual design, courtesy of Natalie Downe. ([#1056](https://github.com/simonw/datasette/pull/1056))
- scale-in animation for column action menu. ([#1039](https://github.com/simonw/datasette/issues/1039))
- Wide tables now scroll horizontally. ([#998](https://github.com/simonw/datasette/issues/998))
- Option to pass a list of templates to `.render_template()` is now documented. ([#1045](https://github.com/simonw/datasette/issues/1045))
- New `datasette.urls.static_plugins()` method. ([#1033](https://github.com/simonw/datasette/issues/1033))
- `BLOB` column values can now be downloaded directly from the Datasette UI. ([#1036](https://github.com/simonw/datasette/issues/1036))
- `.csv` exports now link to direct `BLOB` downloads. ([#1034](https://github.com/simonw/datasette/issues/1034))
- `datasette -o` option now opens the most relevant page. ([#976](https://github.com/simonw/datasette/issues/976))
- `datasette --cors` option now enables access to `/database.db` downloads. ([#1057](https://github.com/simonw/datasette/issues/1057))
- Database file downloads now implement cascading permissions, so you can download a database if you have `view-database-download` permission even if you do not have permission to access the Datasette instance. ([#1058](https://github.com/simonw/datasette/issues/1058))
- New documentation on [Designing URLs for your plugin](https://docs.datasette.io/en/latest/writing_plugins.html#writing-plugins-designing-urls). ([#1053](https://github.com/simonw/datasette/issues/1053))
- New navigation menu plus a [menu_links(datasette, actor)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-menu-links) plugin hook to customize it. ([#1064](https://github.com/simonw/datasette/issues/1064))
- [table_actions(datasette, actor, database, table)](https://docs.datasette.io/en/latest/plugin_hooks.html#plugin-hook-table-actions) plugin hook for the new table actions menu. ([#1066](https://github.com/simonw/datasette/issues/1066))",107914493,
https://github.com/simonw/sqlite-utils/releases/tag/2.23,33188958,MDc6UmVsZWFzZTMzMTg4OTU4,2.23,main,2.23,0,9599,0,2020-10-28T21:38:10Z,2020-10-28T21:38:54Z,"- `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))
- `sqlite-utils insert` now displays a progress bar for CSV or TSV imports. ([#173](https://github.com/simonw/sqlite-utils/issues/173))
- 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))",140912432,
https://github.com/dogsheep/inaturalist-to-sqlite/releases/tag/0.2.1,32891966,MDc6UmVsZWFzZTMyODkxOTY2,0.2.1,master,0.2.1,0,9599,0,2020-10-22T00:08:29Z,2020-10-22T00:08:58Z,"- Tweaked dependencies for compatibility with new PyPI resolver.
",206202864,
https://github.com/dogsheep/pocket-to-sqlite/releases/tag/0.2.1,32891952,MDc6UmVsZWFzZTMyODkxOTUy,0.2.1,master,0.2.1,0,9599,0,2020-10-22T00:06:50Z,2020-10-22T00:08:24Z,- Tweaked dependencies for compatibility with new PyPI resolver.,213286752,
https://github.com/simonw/datasette/releases/tag/0.51a0,32791115,MDc6UmVsZWFzZTMyNzkxMTE1,0.51a0,main,0.51a0,0,9599,1,2020-10-20T05:31:14Z,2020-10-20T05:33:01Z,"- Fixed a bunch of issues relating to the [base_url](https://docs.datasette.io/en/latest/config.html#config-base-url) setting. ([#1023](https://github.com/simonw/datasette/issues/1023))
- New `datasette.urls` URL builder for plugins, see [Building URLs within plugins](https://docs.datasette.io/en/latest/writing_plugins.html#writing-plugins-building-urls). ([#904](https://github.com/simonw/datasette/issues/904))
- Removed `--debug` option, which didn't do anything. ([#814](https://github.com/simonw/datasette/issues/814))
- `Link:` HTTP header pagination. ([#1014](https://github.com/simonw/datasette/issues/1014))
- `x` button for clearing filters. ([#1016](https://github.com/simonw/datasette/issues/1016))
- Edit SQL button on canned queries, ([#1019](https://github.com/simonw/datasette/issues/1019))
- `--load-extension=spatialite` shortcut. ([#1028](https://github.com/simonw/datasette/issues/1028))",107914493,
https://github.com/dogsheep/github-to-sqlite/releases/tag/2.7,32736481,MDc6UmVsZWFzZTMyNzM2NDgx,2.7,main,2.7,0,9599,0,2020-10-19T05:36:32Z,2020-10-19T05:38:34Z,"- `github-to-sqlite repos` command now takes options `--readme` and `--readme-html`, which write the README or rendered HTML README into the `readme` or `readme_html` columns, respectively. #52
- New `--accept` option for `github-to-sqlite get`. #50",207052882,