in a element, to help with advanced CSS customization. ( #1446 )
The render_cell() plugin hook can now return an awaitable function. This means the hook can execute SQL queries. ( #1425 )
register_routes(datasette) plugin hook now accepts an optional datasette argument. ( #1404 )
New hide_sql canned query option for defaulting to hiding the SQL query used by a canned query, see Additional canned query options . ( #1422 )
New --cpu option for datasette publish cloudrun . ( #1420 )
If 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 )
datasette.utils parse_metadata(content) function, used by the new datasette-remote-metadata plugin , is now a documented API. ( #1405 )
Fixed bug where ?_next=x&_sort=rowid could throw an error. ( #1470 )
Column cog menu no longer shows the option to facet by a column that is already selected by the default facets in metadata. ( #1469 )","[""Changelog""]","[{""href"": ""https://github.com/simonw/datasette/issues/942"", ""label"": ""#942""}, {""href"": ""https://github.com/simonw/datasette/issues/1449"", ""label"": ""#1449""}, {""href"": ""https://github.com/simonw/datasette/issues/1423"", ""label"": ""#1423""}, {""href"": ""https://github.com/encode/httpx/releases/tag/0.20.0"", ""label"": ""httpx 0.20""}, {""href"": ""https://github.com/simonw/datasette/issues/1488"", ""label"": ""#1488""}, {""href"": ""https://github.com/simonw/datasette/pull/1467"", ""label"": ""#1467""}, {""href"": ""https://github.com/simonw/datasette/issues/1421"", ""label"": ""#1421""}, {""href"": ""https://github.com/simonw/datasette/issues/1431"", ""label"": ""#1431""}, {""href"": ""https://github.com/simonw/datasette/issues/1443"", ""label"": ""#1443""}, {""href"": ""https://github.com/simonw/datasette/issues/1446"", ""label"": ""#1446""}, {""href"": ""https://github.com/simonw/datasette/issues/1425"", ""label"": ""#1425""}, {""href"": ""https://github.com/simonw/datasette/issues/1404"", ""label"": ""#1404""}, {""href"": ""https://github.com/simonw/datasette/issues/1422"", ""label"": ""#1422""}, {""href"": ""https://github.com/simonw/datasette/issues/1420"", ""label"": ""#1420""}, {""href"": ""https://github.com/willmcgugan/rich"", ""label"": ""Rich""}, {""href"": ""https://github.com/simonw/datasette/issues/1416"", ""label"": ""#1416""}, {""href"": ""https://datasette.io/plugins/datasette-remote-metadata"", ""label"": ""datasette-remote-metadata plugin""}, {""href"": ""https://github.com/simonw/datasette/issues/1405"", ""label"": ""#1405""}, {""href"": ""https://github.com/simonw/datasette/issues/1470"", ""label"": ""#1470""}, {""href"": ""https://github.com/simonw/datasette/issues/1469"", ""label"": ""#1469""}]"
changelog:id30,changelog,id30,0.58.1 (2021-07-16),Fix for an intermittent race condition caused by the refresh_schemas() internal function. ( #1231 ),"[""Changelog""]","[{""href"": ""https://github.com/simonw/datasette/issues/1231"", ""label"": ""#1231""}]"
changelog:id31,changelog,id31,0.58 (2021-07-14),"New datasette --uds /tmp/datasette.sock option for binding Datasette to a Unix domain socket, see proxy documentation ( #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 . ( #1389 )
New plugin hook: get_metadata() , for returning custom metadata for an instance, database or table. Thanks, Brandon Roberts! ( #1384 )
New plugin hook: skip_csrf(datasette, scope) , for opting out of CSRF protection based on the incoming request. ( #1377 )
The menu_links() , table_actions() and database_actions() plugin hooks all gained a new optional request argument providing access to the current request. ( #1371 )
Major performance improvement for Datasette faceting. ( #1394 )
Improved documentation for Running Datasette behind a proxy to recommend using ProxyPreservehost On with Apache. ( #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 )","[""Changelog""]","[{""href"": ""https://github.com/simonw/datasette/issues/1388"", ""label"": ""#1388""}, {""href"": ""https://github.com/simonw/datasette/issues/1389"", ""label"": ""#1389""}, {""href"": ""https://github.com/simonw/datasette/issues/1384"", ""label"": ""#1384""}, {""href"": ""https://github.com/simonw/datasette/issues/1377"", ""label"": ""#1377""}, {""href"": ""https://github.com/simonw/datasette/issues/1371"", ""label"": ""#1371""}, {""href"": ""https://github.com/simonw/datasette/issues/1394"", ""label"": ""#1394""}, {""href"": ""https://github.com/simonw/datasette/issues/1387"", ""label"": ""#1387""}, {""href"": ""https://github.com/simonw/datasette/issues/1365"", ""label"": ""#1365""}]"
changelog:id32,changelog,id32,0.57.1 (2021-06-08),"Fixed visual display glitch with global navigation menu. ( #1367 )
No longer truncates the list of table columns displayed on the /database page. ( #1364 )","[""Changelog""]","[{""href"": ""https://github.com/simonw/datasette/issues/1367"", ""label"": ""#1367""}, {""href"": ""https://github.com/simonw/datasette/issues/1364"", ""label"": ""#1364""}]"
changelog:id33,changelog,id33,0.57 (2021-06-05),"This release fixes a reflected cross-site scripting security hole with the ?_trace=1 feature. You should upgrade to this version, or to Datasette 0.56.1, as soon as possible. ( #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.","[""Changelog""]","[{""href"": ""https://owasp.org/www-community/attacks/xss/#reflected-xss-attacks"", ""label"": ""reflected cross-site scripting""}, {""href"": ""https://github.com/simonw/datasette/issues/1360"", ""label"": ""#1360""}]"
changelog:new-features,changelog,new-features,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 )
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 )
A new ?_facet_size= parameter for customizing the number of facet results returned on a table or view page. ( #1332 )
?_facet_size=max sets that to the maximum, which defaults to 1,000 and is controlled by the the max_returned_rows setting. If facet results are truncated the … at the bottom of the facet list now links to this parameter. ( #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 , #263 )
?_nocount=1 option to disable full query result counts. ( #1353 )
?_trace=1 debugging option is now controlled by the new trace_debug setting, which is turned off by default. ( #1359 )","[""Changelog"", ""0.57 (2021-06-05)""]","[{""href"": ""https://github.com/simonw/datasette/issues/619"", ""label"": ""#619""}, {""href"": ""https://github.com/simonw/datasette/issues/615"", ""label"": ""#615""}, {""href"": ""https://github.com/simonw/datasette/issues/1332"", ""label"": ""#1332""}, {""href"": ""https://github.com/simonw/datasette/issues/1337"", ""label"": ""#1337""}, {""href"": ""https://github.com/simonw/datasette/issues/1349"", ""label"": ""#1349""}, {""href"": ""https://github.com/simonw/datasette/issues/263"", ""label"": ""#263""}, {""href"": ""https://github.com/simonw/datasette/issues/1353"", ""label"": ""#1353""}, {""href"": ""https://github.com/simonw/datasette/issues/1359"", ""label"": ""#1359""}]"
changelog:bug-fixes-and-other-improvements,changelog,bug-fixes-and-other-improvements,Bug fixes and other improvements,"Custom pages now work correctly when combined with the base_url setting. ( #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 )
Columns with the name ""Link"" are no longer incorrectly displayed in bold. ( #1308 )
Fixed error caused by tables with a single quote in their names. ( #1257 )
Updated dependencies: pytest-asyncio , Black , jinja2 , aiofiles , click , and itsdangerous .
The official Datasette Docker image now supports apt-get install . ( #1320 )
The Heroku runtime used by datasette publish heroku is now python-3.8.10 .","[""Changelog"", ""0.57 (2021-06-05)""]","[{""href"": ""https://github.com/simonw/datasette/issues/1238"", ""label"": ""#1238""}, {""href"": ""https://github.com/simonw/datasette/issues/1305"", ""label"": ""#1305""}, {""href"": ""https://github.com/simonw/datasette/issues/1308"", ""label"": ""#1308""}, {""href"": ""https://github.com/simonw/datasette/issues/1257"", ""label"": ""#1257""}, {""href"": ""https://github.com/simonw/datasette/issues/1320"", ""label"": ""#1320""}]"
changelog:id34,changelog,id34,0.56.1 (2021-06-05),"This release fixes a reflected cross-site scripting security hole with the ?_trace=1 feature. You should upgrade to this version, or to Datasette 0.57, as soon as possible. ( #1360 )","[""Changelog""]","[{""href"": ""https://owasp.org/www-community/attacks/xss/#reflected-xss-attacks"", ""label"": ""reflected cross-site scripting""}, {""href"": ""https://github.com/simonw/datasette/issues/1360"", ""label"": ""#1360""}]"
changelog:id35,changelog,id35,0.56 (2021-03-28),"Documentation improvements, bug fixes and support for SpatiaLite 5.
The SQL editor can now be resized by dragging a handle. ( #1236 )
Fixed a bug with JSON faceting and the __arraycontains filter caused by tables with spaces in their names. ( #1239 )
Upgraded httpx dependency. ( #1005 )
JSON faceting is now suggested even if a column contains blank strings. ( #1246 )
New datasette.add_memory_database() method. ( #1247 )
The Response.asgi_send() method is now documented. ( #1266 )
The official Datasette Docker image now bundles SpatiaLite version 5. ( #1278 )
Fixed a no such table: pragma_database_list bug when running Datasette against SQLite versions prior to SQLite 3.16.0. ( #1276 )
HTML lists displayed in table cells are now styled correctly. Thanks, Bob Whitelock. ( #1141 , #1252 )
Configuration directory mode now correctly serves immutable databases that are listed in inspect-data.json . Thanks Campbell Allen and Frankie Robertson. ( #1031 , #1229 )","[""Changelog""]","[{""href"": ""https://github.com/simonw/datasette/issues/1236"", ""label"": ""#1236""}, {""href"": ""https://github.com/simonw/datasette/issues/1239"", ""label"": ""#1239""}, {""href"": ""https://github.com/simonw/datasette/issues/1005"", ""label"": ""#1005""}, {""href"": ""https://github.com/simonw/datasette/issues/1246"", ""label"": ""#1246""}, {""href"": ""https://github.com/simonw/datasette/issues/1247"", ""label"": ""#1247""}, {""href"": ""https://github.com/simonw/datasette/issues/1266"", ""label"": ""#1266""}, {""href"": ""https://github.com/simonw/datasette/issues/1278"", ""label"": ""#1278""}, {""href"": ""https://github.com/simonw/datasette/issues/1276"", ""label"": ""#1276""}, {""href"": ""https://github.com/simonw/datasette/issues/1141"", ""label"": ""#1141""}, {""href"": ""https://github.com/simonw/datasette/pull/1252"", ""label"": ""#1252""}, {""href"": ""https://github.com/simonw/datasette/pull/1031"", ""label"": ""#1031""}, {""href"": ""https://github.com/simonw/datasette/pull/1229"", ""label"": ""#1229""}]"
changelog:id36,changelog,id36,0.55 (2021-02-18),"Support for cross-database SQL queries and built-in support for serving via HTTPS.
The new --crossdb command-line option causes Datasette to attach up to ten database files to the same /_memory database connection. This enables cross-database SQL queries, including the ability to use joins and unions to combine data from tables that exist in different database files. See Cross-database queries for details. ( #283 )
--ssl-keyfile and --ssl-certfile options can be used to specify a TLS certificate, allowing Datasette to serve traffic over https:// without needing to run it behind a separate proxy. ( #1221 )
The /:memory: page has been renamed (and redirected) to /_memory for consistency with the new /_internal database introduced in Datasette 0.54. ( #1205 )
Added plugin testing documentation on Using pdb for errors thrown inside Datasette . ( #1207 )
The official Datasette Docker image now uses Python 3.7.10, applying the latest security fix for that Python version. ( #1235 )","[""Changelog""]","[{""href"": ""https://github.com/simonw/datasette/issues/283"", ""label"": ""#283""}, {""href"": ""https://github.com/simonw/datasette/issues/1221"", ""label"": ""#1221""}, {""href"": ""https://github.com/simonw/datasette/issues/1205"", ""label"": ""#1205""}, {""href"": ""https://github.com/simonw/datasette/issues/1207"", ""label"": ""#1207""}, {""href"": ""https://hub.docker.com/r/datasetteproject/datasette"", ""label"": ""official Datasette Docker image""}, {""href"": ""https://www.python.org/downloads/release/python-3710/"", ""label"": ""the latest security fix""}, {""href"": ""https://github.com/simonw/datasette/issues/1235"", ""label"": ""#1235""}]"
changelog:id37,changelog,id37,0.54.1 (2021-02-02),Fixed a bug where ?_search= and ?_sort= parameters were incorrectly duplicated when the filter form on the table page was re-submitted. ( #1214 ),"[""Changelog""]","[{""href"": ""https://github.com/simonw/datasette/issues/1214"", ""label"": ""#1214""}]"
changelog:id38,changelog,id38,0.54 (2021-01-25),"The two big new features in this release are the _internal SQLite in-memory database storing details of all connected databases and tables, and support for JavaScript modules in plugins and additional scripts.
For additional commentary on this release, see Datasette 0.54, the annotated release notes .","[""Changelog""]","[{""href"": ""https://simonwillison.net/2021/Jan/25/datasette/"", ""label"": ""Datasette 0.54, the annotated release notes""}]"
changelog:the-internal-database,changelog,the-internal-database,The _internal database,"As part of ongoing work to help Datasette handle much larger numbers of connected databases and tables (see Datasette Library ) Datasette now maintains an in-memory SQLite database with details of all of the attached databases, tables, columns, indexes and foreign keys. ( #1150 )
This will support future improvements such as a searchable, paginated homepage of all available tables.
You can explore an example of this database by signing in as root to the latest.datasette.io demo instance and then navigating to latest.datasette.io/_internal .
Plugins can use these tables to introspect attached data in an efficient way. Plugin authors should note that this is not yet considered a stable interface, so any plugins that use this may need to make changes prior to Datasette 1.0 if the _internal table schemas change.","[""Changelog"", ""0.54 (2021-01-25)""]","[{""href"": ""https://github.com/simonw/datasette/issues/417"", ""label"": ""Datasette Library""}, {""href"": ""https://github.com/simonw/datasette/issues/1150"", ""label"": ""#1150""}, {""href"": ""https://latest.datasette.io/login-as-root"", ""label"": ""signing in as root""}, {""href"": ""https://latest.datasette.io/_internal"", ""label"": ""latest.datasette.io/_internal""}]"
changelog:named-in-memory-database-support,changelog,named-in-memory-database-support,Named in-memory database support,"As part of the work building the _internal database, Datasette now supports named in-memory databases that can be shared across multiple connections. This allows plugins to create in-memory databases which will persist data for the lifetime of the Datasette server process. ( #1151 )
The new memory_name= parameter to the Database class can be used to create named, shared in-memory databases.","[""Changelog"", ""0.54 (2021-01-25)""]","[{""href"": ""https://github.com/simonw/datasette/issues/1151"", ""label"": ""#1151""}]"
changelog:javascript-modules,changelog,javascript-modules,JavaScript modules,"JavaScript modules were introduced in ECMAScript 2015 and provide native browser support for the import and export keywords.
To use modules, JavaScript needs to be included in