NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #5985 most downloaded on PyPI
Making it easy to query APIs via SQL
Last release 2 months ago
30 Jul 2026
Release timing varies
gaps range from 2 weeks to 5 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
93 releases · first in 2020
One column per quarter.
fix(postgres): install multicorn2 Python package with venv pip by @Antonio-RiveroMartnez in https://github.com/betodealmeida/shillelagh/pull/547
Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.3.3...1.4.5
Handle temporal Google Sheets columns that omit a formatting pattern (#546)
fix: improve date parsing error messages with value and pattern context by @mistercrunch in https://github.com/betodealmeida/shillelagh/pull/541
Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.4.3...1.4.4
Add sqlalchemy-odata to 3rd-party adapters list (#540)
Improve date parsing error messages with value and pattern context (#541)
fix: tests that rely on timing by @betodealmeida in https://github.com/betodealmeida/shillelagh/pull/530
Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.4.2...1.4.3
feat(metricflow): allow passing token securely by @betodealmeida in https://github.com/betodealmeida/shillelagh/pull/527
Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.4.1...1.4.2
feat: simple MetricFlow adapter+dialect for Superset by @betodealmeida in https://github.com/betodealmeida/shillelagh/pull/525
Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.4.0...1.4.1
Heya, friends! Happy to release 1.4.0 today. The main change is a new experimental backend, based on sqlglot.
Heya, friends! Happy to release 1.4.0 today. The main change is a new experimental backend, based on sqlglot.
Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.3.6...1.4.0
Resolve regex library warnings by @emmanuel-ferdman in https://github.com/betodealmeida/shillelagh/pull/515
Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.3.5...1.3.6
New virtual table with on-the-fly data (#514)
Types can be specified in the expression alias (#518)
fix (gsheets): authenticated get_table_names by @betodealmeida in https://github.com/betodealmeida/shillelagh/pull/508
get_table_names by @betodealmeida in https://github.com/betodealmeida/shillelagh/pull/508Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.3.4...1.3.5
Fix ORDER BY in GSheets (#507)
Fix authenticated get_table_names in GSheets (#508)
chore: implement get_missing_table by @betodealmeida in https://github.com/betodealmeida/shillelagh/pull/497
get_missing_table by @betodealmeida in https://github.com/betodealmeida/shillelagh/pull/497Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.3.3...1.3.4
chore: update author list by @betodealmeida in https://github.com/betodealmeida/shillelagh/pull/492
Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.3.2...1.3.3
A small fix that bumps the minimum version of apsw. This is needed because we started using the create_scalar_function function instead of the less re
A small fix that bumps the minimum version of apsw. This is needed because we started using the create_scalar_function function instead of the less readable createscalarfunction, but the renaming happened in 3.43.2.0.
- Support for Python 3.13
Support for Python 3.13 (#484)
This release includes a new backend for Shillelagh based on Multicorn2, a foreign data wrapper (FDW) extension for Postgres 13-15. To check it out, ru
This release includes a new backend for Shillelagh based on Multicorn2, a foreign data wrapper (FDW) extension for Postgres 13-15. To check it out, run the container:
docker compose -f postgres/docker-compose.yml up
And then the Python script:
from sqlalchemy import create_engine, text
engine = create_engine("shillelagh+multicorn2://shillelagh:shillelagh123@localhost:5432/shillelagh")
connection = engine.connect()
sql = 'SELECT * FROM "https://docs.google.com/spreadsheets/d/1LcWZMsdCl92g7nA-D6qGRqg1T5TiHyuKJUY1u9XAnsk/edit#gid=0"'
for row in connection.execute(text(sql)):
print(row)
It also adds support for Python 3.12, but drops for 3.8. It should be possible to run in 3.8, but it would require separate dependency files for CI/CD, and since 3.8 reached its end-of-life I decided to drop it as well.
New Postgres backend based on multicorn2 (#397)
Add support for Python 3.12, drop support for 3.8 (#478)
Small release adding a way of namespacing the caches, for multi-tenant environments.
Small release adding a way of namespacing the caches, for multi-tenant environments.
Small release fixing the Preset API. It also introduces the UPGRADE function, which can be used to upgrade the library from SQL:
Small release fixing the Preset API. It also introduces the UPGRADE function, which can be used to upgrade the library from SQL:
🍀> SELECT VERSION();
VERSION()
----------------------
1.2.25 (apsw 3.45.3.0)
(1 row in 0.00s)
🍀> SELECT UPGRADE("1.2.26");
UPGRADE("1.2.26")
-----------------------------
Upgrade to 1.2.26 successful.
(1 row in 0.76s)
🍀> SELECT VERSION();
VERSION()
----------------------
1.2.26 (apsw 3.45.3.0)
(1 row in 0.00s)
🍀>
Removes pagination from Preset API and adds note to documentation (#469)
Add UPGRADE() function to upgrade the library (#468)
Small fix to the generic JSON adapter so it works with arrays of strings.
Small fix to the generic JSON adapter so it works with arrays of strings.
Another small release relaxing a dependency so we can use Shillelagh with Apache Superset.
Another small release relaxing a dependency so we can use Shillelagh with Apache Superset.
Small release relaxing the version of the packaging dependency.
Small release relaxing the version of the packaging dependency.
- Support for GitHub stats
Support for GitHub stats (#463)
A small release improving the generic JSON adapter to handle array-only responses.
A small release improving the generic JSON adapter to handle array-only responses.
This release has a small fix for GSheets, when the API returns an invalid type, and also experimental support for the dbt MetricFlow semantic layer.
This release has a small fix for GSheets, when the API returns an invalid type, and also experimental support for the dbt MetricFlow semantic layer.
Fix for invalid pattern in GSheets (#458)
dbt MetricFlow adapter (#459)
Small release fixing the GitHub adapter. I added pagination to the GitHub adapter in #271, but it doesn't work correctly because most of the filtering
Small release fixing the GitHub adapter. I added pagination to the GitHub adapter in #271, but it doesn't work correctly because most of the filtering is done by SQLite, since the GitHub API only allows filtering on a subset of the exposed fields. Because of this, it was returning fewer rows than it should.
Add import_dbapi() to supress warning (#452)
Remove LIMIT and OFFSET from GitHub adapter (#456)
Minor update relaxing the version of tabulate.
Minor update relaxing the version of tabulate.
Minor fix in the GSheets adapter for https://github.com/apache/superset/issues/20300.
Minor fix in the GSheets adapter for https://github.com/apache/superset/issues/20300.
Add support for querying issues with the GitHub adapter.
Add support for querying issues with the GitHub adapter.
Use a different JSONPath library, because the old one didn't handle the root path $ correctly.
Use a different JSONPath library, because the old one didn't handle the root path $ correctly.
Allow for custom expiration time in the generic JSON/XML adapters (#429)
Use a different JSONPath library that handles root better (#431)
Small performance improvements to the Preset adapter, so that the handler leverages pagination and also offset/limit.
Small performance improvements to the Preset adapter, so that the handler leverages pagination and also offset/limit.
Minor release increasing the scope of the Preset adapter, so it can query workspaces as well.
Minor release increasing the scope of the Preset adapter, so it can query workspaces as well.
A new release introducing a handler for the Preset API.
A new release introducing a handler for the Preset API.
(Note that Preset is my employer.)
Small release improving the detection of DROP TABLE queries, so that queries with comments are properly identified.
Small release improving the detection of DROP TABLE queries, so that queries with comments are properly identified.
A minor release relaxing the dependency on holidays so we can use it with Apache Superset.
A minor release relaxing the dependency on holidays so we can use it with Apache Superset.
Small fix. The 1.2.9 release is missing the requests_cache dependency, which is now mandatory (it's used in shillelagh.lib).
Small fix. The 1.2.9 release is missing the requests_cache dependency, which is now mandatory (it's used in shillelagh.lib).
Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.2.9...1.2.10
fix: datassette detection and JSON parsing by @betodealmeida in https://github.com/betodealmeida/shillelagh/pull/399
Full Changelog: https://github.com/betodealmeida/shillelagh/compare/1.2.8...1.2.9
Improve Datasette detection (#399)
Fix generic JSON handling of null values (#399)
Add holidays adapter (#409)
Add support for decimals (#410)
This releases introduces a new adapter, for XML responses. It's similar to the generic JSON adapter, but uses XPath to denote the rows in the XML docu
This releases introduces a new adapter, for XML responses. It's similar to the generic JSON adapter, but uses XPath to denote the rows in the XML document.
Add new cost model NetworkAPICostModel (#381)
Add a generic XML adapter (#391)
Two small fixes for the GSheets adapter (thanks @yang for reporting them).
Two small fixes for the GSheets adapter (thanks @yang for reporting them).
Fix unneeded error when an operators is not supported by adapter (#378)
Fix comparison to empty strings in GSheets (#379)
New release adding support to querying durations in Google Sheets. In the Python API they are returned as datetime.timedelta objects (and should be pa
New release adding support to querying durations in Google Sheets. In the Python API they are returned as datetime.timedelta objects (and should be passed as such when filtering), and in the CLI they are string representations such as 1014 days, 2:03:04.
A new release with some improvements to the system adapter:
A new release with some improvements to the system adapter:
sql> SELECT * FROM "system://" LIMIT 2;
timestamp cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 cpu8 cpu9 cpu10 cpu11 virtual_total virtual_available virtual_percent virtual_used virtual_free virtual_active virtual_inactive virtual_wired swap_total swap_used swap_free swap_percent swap_sin swap_sout
-------------------------------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------- ------- --------------- ------------------- ----------------- -------------- -------------- ---------------- ------------------ --------------- ------------ ----------- ----------- -------------- ----------- -----------
2023-07-14 22:07:10.292952+00:00 0.52 0.01 0.25 0 0.218 0.01 0.2 0.01 0.2 0 0.12 0 34359738368 13592928256 60.4 17968046080 271433728 13326610432 12421562368 4641435648 9663676416 8401190912 1262485504 86.9 90934898688 346648576
2023-07-14 22:07:11.298629+00:00 0.574 0 0.32 0 0.212 0 0.16 0 0.18 0 0.129 0.01 34359738368 13593366528 60.4 17967742976 270090240 13326852096 12423344128 4640890880 9663676416 8401190912 1262485504 86.9 90934898688 346648576
sql>
System adapter now supports memory (virtual/swap) queries (#369 and #372)
In 1.2.3 I was trying to unpin the requests-cache dependency so I can use it with Superset master, but I did it in the wrong place. Now it should work
In 1.2.3 I was trying to unpin the requests-cache dependency so I can use it with Superset master, but I did it in the wrong place. Now it should work.
A small release, unpinning requests-cache, adding the yarl dependency to the generic JSON adapter, and omitting warnings when non-requested adapters f
A small release, unpinning requests-cache, adding the yarl dependency to the generic JSON adapter, and omitting warnings when non-requested adapters fail to to load.
Add yarl dependency to the generic JSON adapter (#355)
Only warn of errors when loading adapters if they are explicitly requested (#360)
Relax dependency for requests-cache (#361)
New feature: you can now pass request headers to the generic JSON adapter via query parameters in the URL, eg:
New feature: you can now pass request headers to the generic JSON adapter via query parameters in the URL, eg:
SELECT *
FROM "https://.../search?domain=facebook&zone=com&_s_headers=(X-Auth-Token:SECRET)#$.domains[*]"
Allow passing request headers to the generic JSON adapter via query arguments (#354)
The biggest feature in this release is the support for BestIndexObject with the latest apsw. This allows plugin to know which columns are being reques
The biggest feature in this release is the support for BestIndexObject with the latest apsw. This allows plugin to know which columns are being requested, reducing the amount of data that needs to be fetched.
Also, Python 3.11 is officially supported now.
And thanks to @sjmillius for their fix to the virtual table syntax (https://github.com/betodealmeida/shillelagh/pull/340).
Allow specifying custom request headers when using the generic JSON adapter (#337)
Fix for escaping identifiers correctly (#340)
Support for S3-compatible storage (#343)
Adapters can now know which columns were requested (#345)
Python 3.11 officially supported (#334)
Fix for error when an adapter can't be loaded (#346)
Fix for BestIndexObject (#350)
Fix for empty dataframes (#351)
This release has some small changes so that the module works with SQLAlchemy 2.0, while still working with 1.4.
This release has some small changes so that the module works with SQLAlchemy 2.0, while still working with 1.4.
Use marshal instead of pickle for adapter argument serde (#321)
Support SQLAlchemy 2.0 (and 1.4) (#331)
s3_select can now use credentials from the environment or config files
Handle dataframes without column names (affects both the Pandas and the HTML table adapters).
Two small fixes:
Handle dataframes without column names (#319)
Support booleans when inferring types from data (#318)
A small release allowing the S3 Select adapter to query JSON documents.
A small release allowing the S3 Select adapter to query JSON documents.
A small improvement to the generic JSON adapter so it can handle nested fields:
A small improvement to the generic JSON adapter so it can handle nested fields:
sql> SELECT NS ->> '$[0]' AS first_ns FROM "https://api.domainsdb.info/v1/domains/search?domain=facebook&zone=com#$.domains[*]" LIMIT 1;
first_ns
----------------------
aron.ns.cloudflare.com
sql>
A small fix ensuring only requested adapters are loaded when in non-safe mode, and a new adapter that handles generic JSON endpoints.
A small fix ensuring only requested adapters are loaded when in non-safe mode, and a new adapter that handles generic JSON endpoints.
Fix preventing loading of non-requested adapters (#303)
New generic JSON adapter (#304)
A new minor version with small fixes.
A new minor version with small fixes.
Add support for CSV files over HTTP(S) (#296)
Fix for fraction parsing in GSheets (#298)
Fix for negative dollar format in GSheets (#299)
Other small fixes and typos.
Today we're releasing Shillelagh 1.1.0. There are no breaking changes, but some interesting new additions:
Heya!
Today we're releasing Shillelagh 1.1.0. There are no breaking changes, but some interesting new additions:
DROP TABLE. If you run DROP TABLE on a Google sheet URL, for example, the sheet will be deleted. This is only supported in the adapters where it makes sense. In the future we might also want to support CREATE TABLE.~/.config/shillelagh/ to ~/Library/Application\ Support/shillelagh/.LIMIT and OFFSET, instead of leaving the work to SQLite. This should greatly improve the performance of adapters, since it can greatly reduce the amount of data than needs to be fetched. Most of the builtin adapters have support for them in 1.1.0.CLI now supports multi-line statements (#205)
Add new adapter for CSV/JSON/Parquet files stored in S3 (#254)
Add support for DROP TABLE (#258)
Add new adapter for scraping data from HTML tables (#259)
Add registry for adapters (#268)
Adapters can implement LIMIT and OFSET (#270)
Add support for polymorphic fields (#280)
Add docs on architecture (#273), dialects (#278)
Improve docs on custom fields (#275)
Configuration directory is now system dependent (#283)
Row updates should no longer raise errors in SQLAlchemy (#284)
This release has no external changes. The only change is how parameters are passed from SQLite to the adapter. The new serialize function uses pickle
This release has no external changes. The only change is how parameters are passed from SQLite to the adapter. The new serialize function uses pickle to allow passing more than just strings to adapters.
Better serialize/deserialize for virtual table arguments, supporting bytes and other types
Includes a new adapter for S3 files, using S3 Select:
Includes a new adapter for S3 files, using S3 Select:
SELECT * FROM "s3://bucket-name/sample_data.csv";
Supports CSV, JSON, and Parquet.
Also changes the way integers work, now we manipulate them as strings inside SQLite to prevent overflows.
Represent integers as strings in SQLite to prevent overflow
Add S3 Select adapter
Includes a small fix by @AAfghahi allowing column names to have double quotes in them.
Includes a small fix by @AAfghahi allowing column names to have double quotes in them.
Release 1.0.13 drops support for Python 3.7. We're also starting to test shillelagh with Python 3.10, hopefully we'll add support soon.
Release 1.0.13 drops support for Python 3.7. We're also starting to test shillelagh with Python 3.10, hopefully we'll add support soon.
Allow adapters/dialects to pass custom parameters to apsw.Connection
Allow adapters/dialects to pass custom parameters to apsw.Connection
Read SQLite constants from apsw
Read SQLite constants from apsw
Fix description returned in the case of empty set
Change cost to be a float
Fix GSheets do_ping
Small fixes and typos.
Enable supports_statement_cache
Relax requests dependency
Enable supports_statement_cache
Fix for GSheets where the first row is not detected as column names
Fix for GSheets where the first row is not detected as column names
Do not try to import non-specified adapters
Do not try to import non-specified adapters
Fix for querying datetime/date/time via SQLAlchemy
Add support for using Google Application Default Credentials for Google Sheets
Add support for using Google Application Default Credentials for Google Sheets
Make package PEP 561 compatible
Add requests as a dependency
Documentation fixes
Add an adapter for system resources (CPU usage for now)
Add an adapter for system resources (CPU usage for now)
Improve PEP 249 compatibility
Implement do_ping for GSheets dialect
Implement do_ping for GSheets dialect
Create a cookiecutter template for new adapters
Add a StringDuration field
Add GitHub adapter
Handle arbitrary number formats in Gsheets
Your coding agent can read these notes before it upgrades. Set up the MCP server →