NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4233 most downloaded on PyPI
CLI tool and Python library for manipulating SQLite databases
Last release 1 months ago
13 Aug 2026
Release timing varies
gaps range from 2 weeks to 7 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
8 years old
139 releases · first in 2018
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v1-2
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v1-2
Improved foreign key definitions: you no longer need to specify the column , other_table AND other_column to define a foreign key - if you omit the other_table or other_column the script will attempt to guess the correct values by introspecting the database. See Adding foreign key constraints for details. ( #25 )
Ability to set NOT NULL constraints and DEFAULT values when creating tables ( #24 ). Documentation: Setting defaults and not null constraints (Python API) , Setting defaults and not null constraints (CLI)
Support for not_null_default=X / --not-null-default for setting a NOT NULL DEFAULT 'x' when adding a new column. Documentation: Adding columns (Python API) , Adding columns (CLI)
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v1-1
One column per quarter.
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v1-1
ignore=True / --ignore for ignoring inserted records if the primary key alread exists (#21)fk=... / --fk (#16)Support for ignore=True / --ignore for ignoring inserted records if the primary key already exists ( #21 ) - documentation: Inserting data (Python API) , Inserting data (CLI)
Ability to add a column that is a foreign key reference using fk=... / --fk ( #16 ) - documentation: Adding columns (Python API) , Adding columns (CLI)
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v1-0-1
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v1-0-1
sqlite-utils rows data.db table --json-cols - fixed bug where --json-cols was not obeyed
sqlite-utils rows data.db table --json-cols - fixed bug where --json-cols was not obeyed
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v1-0
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v1-0
db["tablename"].insert(record, alter=True) - see Adding columns automatically using the Python API
New --json-cols option for outputting nested JSON, see Nested JSON values
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-14
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-14
Ability to create unique indexes: db["mytable"].create_index(["name"], unique=True)
db["mytable"].create_index(["name"], if_not_exists=True)
$ sqlite-utils create-index mydb.db mytable col1 [col2...] , see Creating indexes
table.add_column(name, type) method, see Adding columns
$ sqlite-utils add-column mydb.db mytable nameofcolumn , see Adding columns (CLI)
db["books"].add_foreign_key("author_id", "authors", "id") , see Adding foreign key constraints
$ sqlite-utils add-foreign-key books.db books author_id authors id , see Adding foreign key constraints (CLI)
Improved (but backwards-incompatible) foreign_keys= argument to various methods, see Specifying foreign keys
Ability to create unique indexes: db["mytable"].create_index(["name"], unique=True)
db["mytable"].create_index(["name"], if_not_exists=True)
$ sqlite-utils create-index mydb.db mytable col1 [col2...], see cli_create_index
table.add_column(name, type) method, see python_api_add_column
$ sqlite-utils add-column mydb.db mytable nameofcolumn, see cli_add_column (CLI)
db["books"].add_foreign_key("author_id", "authors", "id"), see python_api_add_foreign_key
$ sqlite-utils add-foreign-key books.db books author_id authors id, see cli_add_foreign_key (CLI)
Improved (but backwards-incompatible) foreign_keys= argument to various methods, see python_api_foreign_keys
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-13
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-13
New --table and --fmt options can be used to output query results in a variety of visual table formats, see Table-formatted output
New hash_id= argument can now be used for Setting an ID based on the hash of the row contents
Can now derive correct column types for numpy int, uint and float values
table.last_id has been renamed to table.last_rowid
table.last_pk now contains the last inserted primary key, if pk= was specified
Prettier indentation in the CREATE TABLE generated schemas
New --table and --fmt options can be used to output query results in a variety of visual table formats, see cli_query_table
New hash_id= argument can now be used for python_api_hash
Can now derive correct column types for numpy int, uint and float values
table.last_id has been renamed to table.last_rowid
table.last_pk now contains the last inserted primary key, if pk= was specified
Prettier indentation in the CREATE TABLE generated schemas
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-12
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-12
Added db[table].rows iterator - see Listing rows
Replaced sqlite-utils json and sqlite-utils csv with a new default subcommand called sqlite-utils query which defaults to JSON and takes formatting options --nl , --csv and --no-headers - see Returning JSON and Returning CSV or TSV
New sqlite-utils rows data.db name-of-table command, see Returning all rows in a table
sqlite-utils table command now takes options --counts and --columns plus the standard output format options, see Listing tables
Added db[table].rows iterator - see python_api_rows
Replaced sqlite-utils json and sqlite-utils csv with a new default subcommand called sqlite-utils query which defaults to JSON and takes formatting options --nl, --csv and --no-headers - see cli_query_json and cli_query_csv
New sqlite-utils rows data.db name-of-table command, see cli_rows
sqlite-utils table command now takes options --counts and --columns plus the standard output format options, see cli_tables
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-11
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-11
New commands for enabling FTS against a table and columns:
sqlite-utils enable-fts db.db mytable col1 col2
See Configuring full-text search .
New commands for enabling FTS against a table and columns:
sqlite-utils enable-fts db.db mytable col1 col2
See cli_fts.
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-10
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-10
Handle datetime.date and datetime.time values.
New option for efficiently inserting rows from a CSV:
sqlite-utils insert db.db foo - --csv
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-9
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-9
Improved support for newline-delimited JSON.
sqlite-utils insert has two new command-line options:
--nl means “expect newline-delimited JSON”. This is an extremely efficient way of loading in large amounts of data, especially if you pipe it into standard input.
--batch-size=1000 lets you increase the batch size (default is 100). A commit will be issued every X records. This also control how many initial records are considered when detecting the desired SQL table schema for the data.
In the Python API, the table.insert_all(...) method can now accept a generator as well as a list of objects. This will be efficiently used to populate the table no matter how many records are produced by the generator.
The Database() constructor can now accept a pathlib.Path object in addition to a string or an existing SQLite connection object.
Nothing published for this version
Two new commands: sqlite-utils csv and sqlite-utils json
Two new commands: sqlite-utils csv and sqlite-utils json
https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-8
Two new commands: sqlite-utils csv and sqlite-utils json
These commands execute a SQL query and return the results as CSV or JSON. See Returning CSV or TSV and Returning JSON for more details.
$ sqlite-utils json --help Usage: sqlite-utils json [OPTIONS] PATH SQL
Execute SQL query and return the results as JSON
Options: --nl Output newline-delimited JSON --arrays Output rows as arrays instead of objects --help Show this message and exit.
$ sqlite-utils csv --help Usage: sqlite-utils csv [OPTIONS] PATH SQL
Execute SQL query and return the results as CSV
Options: --no-headers Exclude headers from CSV output --help Show this message and exit.
Two new commands: sqlite-utils csv and sqlite-utils json
These commands execute a SQL query and return the results as CSV or JSON. See cli_query_csv and cli_query_json for more details.
$ sqlite-utils json --help Usage: sqlite-utils json [OPTIONS] PATH SQL Execute SQL query and return the results as JSON Options: --nl Output newline-delimited JSON --arrays Output rows as arrays instead of objects --help Show this message and exit. $ sqlite-utils csv --help Usage: sqlite-utils csv [OPTIONS] PATH SQL Execute SQL query and return the results as CSV Options: --no-headers Exclude headers from CSV output --help Show this message and exit.
Release notes are here: https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-7
Release notes are here: https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v0-7
This release implements the sqlite-utils command-line tool with a number of useful subcommands.
sqlite-utils tables demo.db lists the tables in the database
sqlite-utils tables demo.db --fts4 shows just the FTS4 tables
sqlite-utils tables demo.db --fts5 shows just the FTS5 tables
sqlite-utils vacuum demo.db runs VACUUM against the database
sqlite-utils optimize demo.db runs OPTIMIZE against all FTS tables, then VACUUM
sqlite-utils optimize demo.db --no-vacuum runs OPTIMIZE but skips VACUUM
The two most useful subcommands are upsert and insert , which allow you to ingest JSON files with one or more records in them, creating the corresponding table with the correct columns if it does not already exist. See Inserting JSON data for more details.
sqlite-utils insert demo.db dogs dogs.json --pk=id inserts new records from dogs.json into the dogs table
sqlite-utils upsert demo.db dogs dogs.json --pk=id upserts records, replacing any records with duplicate primary keys
One backwards incompatible change: the db["table"].table_names property is now a method:
db["table"].table_names() returns a list of table names
db["table"].table_names(fts4=True) returns a list of just the FTS4 tables
db["table"].table_names(fts5=True) returns a list of just the FTS5 tables
A few other changes:
Plenty of updated documentation, including full coverage of the new command-line tool
Allow column names to be reserved words (use correct SQL escaping)
Added automatic column support for bytes and datetime.datetime
Nothing published for this version
- db.tables and db.table_names introspection properties
db.tables and db.table_names introspection properties
db.indexes property for introspecting indexes
table.create_index(columns, index_name) method
db.create_view(name, sql) method
Table methods can now be chained, plus added table.last_id for accessing the last inserted row ID
- enable_fts() , populate_fts() and search() table methods
enable_fts() , populate_fts() and search() table methods
- Added badges to the documentation
Documented related projects
Added badges to the documentation
- New Table class representing a table in the SQLite database
New Table class representing a table in the SQLite database
Case-insensitive column matching
Initial release to PyPI
On this page
Changelog
4.2.1 (2026-08-13)
4.2 (2026-08-13)
3.39.1 (2026-07-25)
4.1.1 (2026-07-12)
4.1 (2026-07-11)
4.0 (2026-07-07)
Bug fixes since 4.0rc4
4.0rc4 (2026-07-06)
4.0rc3 (2026-07-05)
Breaking changes
Compound foreign key support
Other foreign key improvements
Case-insensitive column matching
Everything else
4.0rc2 (2026-07-04)
4.0rc1 (2026-06-21)
3.39 (2025-11-24)
4.0a1 (2025-11-23)
4.0a0 (2025-05-08)
3.38 (2024-11-23)
3.37 (2024-07-18)
3.36 (2023-12-07)
3.35.2 (2023-11-03)
3.35.1 (2023-09-08)
3.35 (2023-08-17)
3.34 (2023-07-22)
3.33 (2023-06-25)
3.32.1 (2023-05-21)
3.32 (2023-05-21)
3.31 (2023-05-08)
3.30 (2022-10-25)
3.29 (2022-08-27)
3.28 (2022-07-15)
3.27 (2022-06-14)
3.26.1 (2022-05-02)
3.26 (2022-04-13)
3.25.1 (2022-03-11)
3.25 (2022-03-01)
3.24 (2022-02-15)
3.23 (2022-02-03)
3.22.1 (2022-01-25)
3.22 (2022-01-11)
3.21 (2022-01-10)
3.20 (2022-01-05)
3.19 (2021-11-20)
3.18 (2021-11-14)
3.17.1 (2021-09-22)
3.17 (2021-08-24)
3.16 (2021-08-18)
3.15.1 (2021-08-10)
3.15 (2021-08-09)
3.14 (2021-08-02)
3.13 (2021-07-24)
3.12 (2021-06-25)
3.11 (2021-06-20)
3.10 (2021-06-19)
sqlite-utils memory
sqlite-utils insert --detect-types
Other changes
3.9.1 (2021-06-12)
3.9 (2021-06-11)
3.8 (2021-06-02)
3.7 (2021-05-28)
3.6 (2021-02-18)
3.5 (2021-02-14)
3.4.1 (2021-02-05)
3.4 (2021-02-05)
3.3 (2021-01-17)
3.2.1 (2021-01-12)
3.2 (2021-01-03)
3.1.1 (2021-01-01)
3.1 (2020-12-12)
3.0 (2020-11-08)
2.23 (2020-10-28)
2.22 (2020-10-16)
2.21 (2020-09-24)
2.20 (2020-09-22)
Transform
Extract
Other changes
2.19 (2020-09-20)
2.18 (2020-09-08)
2.17 (2020-09-07)
2.16.1 (2020-08-28)
2.16 (2020-08-21)
2.15.1 (2020-08-12)
2.15 (2020-08-10)
2.14.1 (2020-08-05)
2.14 (2020-08-01)
2.13 (2020-07-29)
2.12 (2020-07-27)
2.11 (2020-07-08)
2.10.1 (2020-06-23)
2.10 (2020-06-12)
2.9.1 (2020-05-11)
2.9 (2020-05-10)
2.8 (2020-05-03)
2.7.2 (2020-05-02)
2.7.1 (2020-05-01)
2.7 (2020-04-17)
2.6 (2020-04-15)
2.5 (2020-04-12)
2.4.4 (2020-03-23)
2.4.3 (2020-03-23)
2.4.2 (2020-03-14)
2.4.1 (2020-03-01)
2.4 (2020-02-26)
2.3.1 (2020-02-10)
2.3 (2020-02-08)
2.2.1 (2020-02-06)
2.2 (2020-02-01)
2.1 (2020-01-30)
2.0.1 (2020-01-05)
2.0 (2019-12-29)
1.12.1 (2019-11-06)
1.12 (2019-11-04)
1.11 (2019-09-02)
1.10 (2019-08-23)
1.9 (2019-08-04)
1.8 (2019-07-28)
1.7.1 (2019-07-28)
1.7 (2019-07-24)
1.6 (2019-07-18)
1.5 (2019-07-14)
1.4.1 (2019-07-14)
1.4 (2019-06-30)
1.3 (2019-06-28)
1.2.2 (2019-06-25)
1.2.1 (2019-06-20)
1.2 (2019-06-12)
1.1 (2019-05-28)
1.0.1 (2019-05-27)
1.0 (2019-05-24)
0.14 (2019-02-24)
0.13 (2019-02-23)
0.12 (2019-02-22)
0.11 (2019-02-07)
0.10 (2019-02-06)
0.9 (2019-01-27)
0.8 (2019-01-25)
0.7 (2019-01-24)
0.6 (2018-08-12)
0.5 (2018-08-05)
0.4 (2018-07-31)
0.3.1 (2018-07-31)
0.3 (2018-07-31)
0.2 (2018-07-28)
Your coding agent can read these notes before it upgrades. Set up the MCP server →