Commit graph

34 commits

Author SHA1 Message Date
Simon Willison
8e015d024c Compound primary keys now resolve in PRIMARY KEY declaration order
PRAGMA table_info sets is_pk to the 1-based position of each column
within the PRIMARY KEY, which can differ from table column order.
table.pks previously returned table column order, so an implicit
compound FOREIGN KEY ... REFERENCES other was introspected with its
referenced columns inverted, and transform() baked that inverted order
into the rewritten schema - failing with IntegrityError on valid data,
or silently reversing the constraint with foreign keys off.

table.pks, compound foreign key guessing (create, add_foreign_key) and
transform() now all use declaration order, and transform() no longer
reorders a compound PRIMARY KEY (b, a) into table column order.

Refs https://github.com/simonw/sqlite-utils/issues/769#issuecomment-4900034150

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 21:34:02 -07:00
Simon Willison
8f0c06e188
Test against Python 3.15-dev, bump ty and Black (#738)
* Add Python 3.15-dev to test matrix
* Run ty check only on 3.14
* Bump Black version
* Update tabulate and use that in 
* Bump to latest ty
2026-05-17 16:52:48 -07:00
Simon Willison
fd5b09f64b
Database as a context manager, fixed many pytest warnings
* Database can now work as a context manager
* Claude Code helped fix a ton of .close() warnings

https://gistpreview.github.io/?730f0c5dc38528a1dd0615f330bd5481

* New autouse fixture to help with test warnings

Refs https://github.com/simonw/sqlite-utils/issues/692#issuecomment-3644371889

* Fix all remaining resource warnings

https://gistpreview.github.io/?0bb8e869b82f6ff0db647de755182502

Closes #692
2025-12-11 16:56:12 -08:00
Simon Willison
fb93452ea8
Use double quotes not braces for tables and columns (#678)
Closes #677
2025-11-23 20:43:26 -08:00
Simon Willison
d2bcdc00c6 Swapped the order of a bunch of pytest comparisons
When I wrote this I thought constant == value was a better assertion. I no longer think that.
2023-08-17 18:05:13 -07:00
Simon Willison
36ffcafb1a table.default_values property, closes #475
Refs #468
2022-08-27 15:42:58 -07:00
Simon Willison
b8af3b96f5 Fix bug with detect_fts() and similar table names, closes #434 2022-06-14 16:24:06 -07:00
Simon Willison
e3f108e0f3 db.supports_strict and table.strict properties, refs #344 2021-11-29 14:19:30 -08:00
Simon Willison
4823aff4c3 table.count_where() method, closes #305 2021-08-01 22:08:17 -07:00
Simon Willison
90e211e3e2 Now complies with flake8, refs #291 2021-06-22 18:22:08 -07:00
Simon Willison
5b257949d9 table.use_rowid introspection property, closes #285 2021-06-19 08:12:29 -07:00
Simon Willison
0d2e4f49f3 db.schema and 'sqlite-utils schema' command, closes #268 2021-06-11 13:51:49 -07:00
Simon Willison
9c67cb9252 table.xindexes property plus improved introspection documentation, closes #261 2021-06-02 20:51:27 -07:00
Simon Willison
b4f09146d3 table.has_counts_triggers property, refs #219 2021-01-03 12:41:24 -08:00
Simon Willison
de08096989 database.triggers_dict, closes #216 2021-01-02 20:19:55 -08:00
Simon Willison
b067f1ff57 table.triggers_dict property, closes #211 2021-01-01 18:10:04 -08:00
Simon Willison
59d8689ed0 table.virtual_table_using property, closes #196 2020-11-04 19:53:45 -08:00
Simon Willison
cf2cb244fa
Tracer mechanism for showing underlying SQL queries
* Pass a tracer= function to Database constructor
* New db.tracer() contextmanager
* Neater SQL indentation, because tracer means it could be visible now
* New db.execute() and db.executescript() methods

Closes #150
2020-09-07 14:56:59 -07:00
Simon Willison
fc38868bd4 Refactored tests into new test_rows.py, refs #76 2020-04-15 18:04:55 -07:00
Simon Willison
2ca63e3b2d
db.triggers and table.triggers introspection (#60)
Closes #59
2019-09-02 17:09:41 -07:00
Simon Willison
9faa982226
Ability to introspect and run queries against views (#55)
* db.views_names() method and and db.views property
* Separate View and Table classes, both subclassing new Queryable class
* view.drop() method
* Updated documentation
2019-08-23 15:19:41 +03:00
Simon Willison
e4a11b1815 Refactor .update() to use .get()
.pks introspection now returns [rowid] for rowid tables.
2019-07-28 15:44:33 +03:00
Simon Willison
58db40d67c Better __repr__ for tables 2019-07-22 17:05:51 -07:00
Simon Willison
d645032cfa add_foreign_key can now detect table and pk, refs #25 2019-06-12 21:51:09 -07:00
Simon Willison
3095f2e671 Added db[table].rows iterator 2019-02-21 21:29:50 -08:00
Simon Willison
0a8194e730 sqlite-utils optimize command, .optimize() and .detect_fts() table methods 2019-01-24 20:35:51 -08:00
Simon Willison
015bd2a840 Test for .table_names(fts5=True) 2019-01-24 20:23:53 -08:00
Simon Willison
66fd63b119 Ability to list just FTS4 or FTS5 table names 2019-01-24 19:57:04 -08:00
Simon Willison
fcc38b9ff2 Moved fixtures into conftest.py 2018-08-12 17:25:39 -07:00
Simon Willison
c611ed80d2 .indexes property for introspecting indexes 2018-07-31 18:31:29 -07:00
Simon Willison
515d362ad6 .table_names and .tables properties plus expanded docs 2018-07-31 17:35:36 -07:00
Simon Willison
c446e22f34 Moved fixtures to fixtures.py, added .schema test 2018-07-31 08:55:24 -07:00
Simon Willison
5deb65f062 Now you just 'from sqlite_utils import Database'
Plus fixed ad_id in the Russian ads example in the docs
2018-07-30 20:30:23 -07:00
Simon Willison
b69f8b6c85 table.count property, plus made a start on table documentation 2018-07-30 20:24:35 -07:00