{"id": 862823026, "node_id": "PR_kwDOCGYnMM4zbaJy", "number": 410, "state": "closed", "locked": 0, "title": "Correct spelling mistakes (found with codespell)", "user": {"value": 3818, "label": "EdwardBetts"}, "body": null, "created_at": "2022-02-24T20:44:18Z", "updated_at": "2022-03-06T08:48:29Z", "closed_at": "2022-03-01T21:05:29Z", "merged_at": "2022-03-01T21:05:29Z", "merge_commit_sha": "b6c9dfce0ba27eb5fb6bc2221044798420f861c4", "assignee": null, "milestone": null, "draft": 0, "head": "a174069da6669b8914d4a08dded7fd750d52a316", "base": "7a098aa0c5e8beef6ccc55c866cf7792af5fcf43", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/410", "merged_by": null, "auto_merge": null} {"id": 205770996, "node_id": "MDExOlB1bGxSZXF1ZXN0MjA1NzcwOTk2", "number": 1, "state": "closed", "locked": 0, "title": "Make .indexes compatible with older SQLite versions", "user": {"value": 9599, "label": "simonw"}, "body": "Older SQLite versions return a different set of columns from the PRAGMA we are using.", "created_at": "2018-08-02T15:17:05Z", "updated_at": "2018-08-02T15:17:30Z", "closed_at": "2018-08-02T15:17:30Z", "merged_at": "2018-08-02T15:17:30Z", "merge_commit_sha": "741e8f7fe563e18fe9a12ac1ce38157e8c903505", "assignee": null, "milestone": null, "draft": 0, "head": "9e674311065b8372f0a93becc8e7357ceffd353b", "base": "0aa28293adedc488eb9107dc52b5e9a124887fbd", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/1", "merged_by": null, "auto_merge": null} {"id": 247576942, "node_id": "MDExOlB1bGxSZXF1ZXN0MjQ3NTc2OTQy", "number": 4, "state": "closed", "locked": 0, "title": "Fts5", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-01-25T06:54:05Z", "updated_at": "2019-01-25T06:54:33Z", "closed_at": "2019-01-25T06:54:33Z", "merged_at": "2019-01-25T06:54:33Z", "merge_commit_sha": "42b2b4b785e3163371e92a9cc085bc47e7c83107", "assignee": null, "milestone": null, "draft": 0, "head": "7f205d2308443557bcaec497b3d0badc0dc26f06", "base": "ccb2a1e729780689188005a52c362b7e963f71e8", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/4", "merged_by": null, "auto_merge": null} {"id": 247861419, "node_id": "MDExOlB1bGxSZXF1ZXN0MjQ3ODYxNDE5", "number": 5, "state": "closed", "locked": 0, "title": "Run Travis tests against Python 3.8-dev", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-01-26T02:30:55Z", "updated_at": "2019-01-26T02:37:54Z", "closed_at": "2019-01-26T02:37:54Z", "merged_at": "2019-01-26T02:37:54Z", "merge_commit_sha": "3a944d0c077c203277f13dd69387eb84b5c88d3e", "assignee": null, "milestone": null, "draft": 0, "head": "b2f81e86074526d6e4dc9e39e791deff195669de", "base": "9a4d1ff0a268c7df7839389acd92d48752d24b95", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/5", "merged_by": null, "auto_merge": null} {"id": 255658112, "node_id": "MDExOlB1bGxSZXF1ZXN0MjU1NjU4MTEy", "number": 12, "state": "closed", "locked": 0, "title": "Support for numpy types, closes #11", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-02-24T03:57:32Z", "updated_at": "2019-02-24T04:02:20Z", "closed_at": "2019-02-24T04:02:20Z", "merged_at": "2019-02-24T04:02:20Z", "merge_commit_sha": "e615d22c5564ea1f32abb086088b2700110be10a", "assignee": null, "milestone": null, "draft": 0, "head": "7c20e60685088d6da0739749305215790ca8375a", "base": "c5068a0972651b3e359ebc2d6c1486b8b7d2c242", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/12", "merged_by": null, "auto_merge": null} {"id": 292879204, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkyODc5MjA0", "number": 32, "state": "closed", "locked": 0, "title": "db.add_foreign_keys() method", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #31. Still TODO:\r\n\r\n- [x] Unit tests\r\n- [x] Documentation", "created_at": "2019-06-28T15:40:33Z", "updated_at": "2019-06-29T06:27:39Z", "closed_at": "2019-06-29T06:27:39Z", "merged_at": "2019-06-29T06:27:39Z", "merge_commit_sha": "997d8758fc8992be93d5984556e5b9e3bad4205f", "assignee": null, "milestone": null, "draft": 0, "head": "fc81588cc31df58374c996884c67cedd98a06f4a", "base": "86bd2bba689e25f09551d611ccfbee1e069e5b66", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/32", "merged_by": null, "auto_merge": null} {"id": 293117183, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkzMTE3MTgz", "number": 34, "state": "closed", "locked": 0, "title": "sqlite-utils index-foreign-keys / db.index_foreign_keys()", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #33\r\n\r\n- [x] `sqlite-utils index-foreign-keys` command\r\n- [x] `db.index_foreign_keys()` method\r\n- [x] unit tests\r\n- [x] documentation", "created_at": "2019-06-30T16:43:40Z", "updated_at": "2019-06-30T23:50:55Z", "closed_at": "2019-06-30T23:50:55Z", "merged_at": "2019-06-30T23:50:54Z", "merge_commit_sha": "e8f887ef4a0977243811b90bc2ce9aed9d2c206a", "assignee": null, "milestone": null, "draft": 0, "head": "d82b000e3d55067516e2ce42f131cf4695e80dca", "base": "0fe3b38290e1bb2d92746d90318d8662b57218bd", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/34", "merged_by": null, "auto_merge": null} {"id": 297412464, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk3NDEyNDY0", "number": 38, "state": "closed", "locked": 0, "title": "table.update() method", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #35\r\n\r\nStill to do:\r\n\r\n- [x] Unit tests\r\n- [x] Switch to using `.get()`\r\n- [x] Better exceptions, plus unit tests for what happens if pk does not exist\r\n- [x] Documentation\r\n- [x] Ensure compound primary keys work properly\r\n- [x] `alter=True` support", "created_at": "2019-07-14T17:03:49Z", "updated_at": "2019-07-28T15:43:51Z", "closed_at": "2019-07-28T15:43:51Z", "merged_at": "2019-07-28T15:43:51Z", "merge_commit_sha": "0747dabb24b608e8524de4858ce50c60ba7e471b", "assignee": null, "milestone": null, "draft": 0, "head": "16d7008002b43cf47a973791da93e5cdd5913fc3", "base": "a6749cdf43229c4f7864c946496e9ac0141627d9", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/38", "merged_by": null, "auto_merge": null} {"id": 297459797, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk3NDU5Nzk3", "number": 40, "state": "closed", "locked": 0, "title": ".get() method plus support for compound primary keys", "user": {"value": 9599, "label": "simonw"}, "body": "- [x] Tests for the `NotFoundError` exception\r\n- [x] Documentation for `.get()` method\r\n- [x] Support `--pk` multiple times to define CLI compound primary keys\r\n- [x] Documentation for compound primary keys", "created_at": "2019-07-15T03:43:13Z", "updated_at": "2019-07-15T04:28:57Z", "closed_at": "2019-07-15T04:28:52Z", "merged_at": "2019-07-15T04:28:52Z", "merge_commit_sha": "c65b67ca46f70e2da46a5b945f4ed358173262e9", "assignee": null, "milestone": null, "draft": 0, "head": "b5a5df6d0ed47f33f6e1b4873948ead9a7c71060", "base": "65b2156d9cc0aa6b5c3dc7a6bd600d98b281a13b", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/40", "merged_by": null, "auto_merge": null} {"id": 300286535, "node_id": "MDExOlB1bGxSZXF1ZXN0MzAwMjg2NTM1", "number": 45, "state": "closed", "locked": 0, "title": "Implemented table.lookup(...), closes #44", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-07-23T13:03:30Z", "updated_at": "2019-07-23T13:07:00Z", "closed_at": "2019-07-23T13:07:00Z", "merged_at": "2019-07-23T13:07:00Z", "merge_commit_sha": "580502431614d3653c93249988290265f3163d4b", "assignee": null, "milestone": null, "draft": 0, "head": "c0852ce018425450d6c040040f32729d41ff635c", "base": "f3a4c3d3ee6475a6caf3c9606656dbaf1df020b7", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/45", "merged_by": null, "auto_merge": null} {"id": 300377599, "node_id": "MDExOlB1bGxSZXF1ZXN0MzAwMzc3NTk5", "number": 47, "state": "closed", "locked": 0, "title": "extracts= table parameter", "user": {"value": 9599, "label": "simonw"}, "body": "Still needs docs. Refs #46", "created_at": "2019-07-23T16:30:29Z", "updated_at": "2019-07-23T17:00:43Z", "closed_at": "2019-07-23T17:00:43Z", "merged_at": "2019-07-23T17:00:43Z", "merge_commit_sha": "941d281aee6eac20ad64b505511da7e47f697700", "assignee": null, "milestone": null, "draft": 0, "head": "1c9d08f75a48b2a3770f2a880462dc8b195289b7", "base": "e22cfcd953f967f6e9551b3a048d7c40726f349b", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/47", "merged_by": null, "auto_merge": null} {"id": 301824097, "node_id": "MDExOlB1bGxSZXF1ZXN0MzAxODI0MDk3", "number": 51, "state": "closed", "locked": 0, "title": "Fix for too many SQL variables, closes #50", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-07-28T11:30:30Z", "updated_at": "2019-07-28T11:59:32Z", "closed_at": "2019-07-28T11:59:32Z", "merged_at": "2019-07-28T11:59:32Z", "merge_commit_sha": "9cb045284ede8009c12abdb1755b5b20f6ccff5f", "assignee": null, "milestone": null, "draft": 0, "head": "0c1b8b7f96be874bb63801f69323960f277aa49a", "base": "9b7be79c86b4283f24a64f62257c918f12542997", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/51", "merged_by": null, "auto_merge": null} {"id": 303990683, "node_id": "MDExOlB1bGxSZXF1ZXN0MzAzOTkwNjgz", "number": 53, "state": "closed", "locked": 0, "title": "Work in progress: m2m() method for creating many-to-many records", "user": {"value": 9599, "label": "simonw"}, "body": "- [x] `table.insert({\"name\": \"Barry\"}).m2m(\"tags\", lookup={\"tag\": \"Coworker\"})`\r\n- [x] Explicit table name `.m2m(\"humans\", ..., m2m_table=\"relationships\")`\r\n- [x] Automatically use an existing m2m table if a single obvious candidate exists (a table with two foreign keys in the correct directions)\r\n- [x] Require the explicit `m2m_table=` argument if multiple candidates for the m2m table exist\r\n- [x] Documentation\r\n\r\nRefs #23", "created_at": "2019-08-03T10:03:56Z", "updated_at": "2019-08-04T03:38:10Z", "closed_at": "2019-08-04T03:37:33Z", "merged_at": "2019-08-04T03:37:33Z", "merge_commit_sha": "4c0912dbf27b12071aca9569bcf7233e60f91c7c", "assignee": null, "milestone": null, "draft": 0, "head": "243bcaa1acd32a173c07b24dca553991493005a0", "base": "e1021030dd2d8d4705ad0e7bae389eeaea7fa17b", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/53", "merged_by": null, "auto_merge": null} {"id": 308292447, "node_id": "MDExOlB1bGxSZXF1ZXN0MzA4MjkyNDQ3", "number": 55, "state": "closed", "locked": 0, "title": "Ability to introspect and run queries against views", "user": {"value": 9599, "label": "simonw"}, "body": "See #54 ", "created_at": "2019-08-17T13:40:56Z", "updated_at": "2019-08-23T12:19:42Z", "closed_at": "2019-08-23T12:19:42Z", "merged_at": "2019-08-23T12:19:42Z", "merge_commit_sha": "9faa98222669723d31e918bb16a42c13c363817f", "assignee": null, "milestone": null, "draft": 0, "head": "4441d6d838fd7518ce715184361f549a04ec8b70", "base": "0e7b461eb3e925aef713206c15794ceae9259c57", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/55", "merged_by": null, "auto_merge": null} {"id": 313383317, "node_id": "MDExOlB1bGxSZXF1ZXN0MzEzMzgzMzE3", "number": 60, "state": "closed", "locked": 0, "title": "db.triggers and table.triggers introspection", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #59", "created_at": "2019-09-03T00:04:32Z", "updated_at": "2019-09-03T00:09:42Z", "closed_at": "2019-09-03T00:09:42Z", "merged_at": "2019-09-03T00:09:42Z", "merge_commit_sha": "2ca63e3b2de5408a860c6c7c1852deb9a138279e", "assignee": null, "milestone": null, "draft": 0, "head": "b0a27fbb34b4362ef192deb560612fabf046cd32", "base": "405e092d5916e70df10f82d15e9c052aa9ee8d80", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/60", "merged_by": null, "auto_merge": null} {"id": 337847573, "node_id": "MDExOlB1bGxSZXF1ZXN0MzM3ODQ3NTcz", "number": 64, "state": "closed", "locked": 0, "title": "test_insert_upsert_all_empty_list", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-11-07T04:24:45Z", "updated_at": "2019-11-07T04:32:38Z", "closed_at": "2019-11-07T04:32:38Z", "merged_at": "2019-11-07T04:32:38Z", "merge_commit_sha": "8dab9fd1ccf571e188eec9ccf606a0c50fccf200", "assignee": null, "milestone": null, "draft": 0, "head": "8daea7f1265ddcce67d28258068a25666954000f", "base": "a0a65f9a6405079b01aefdbf4b5f507bc758567a", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/64", "merged_by": null, "auto_merge": null} {"id": 337853394, "node_id": "MDExOlB1bGxSZXF1ZXN0MzM3ODUzMzk0", "number": 65, "state": "closed", "locked": 0, "title": "Release 1.12.1", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-11-07T04:51:29Z", "updated_at": "2019-11-07T04:58:48Z", "closed_at": "2019-11-07T04:58:47Z", "merged_at": "2019-11-07T04:58:47Z", "merge_commit_sha": "0a0cec3cf27861455e8cd1c4d84937825a18bb30", "assignee": null, "milestone": null, "draft": 0, "head": "28f8a238ab8fc2a70ee81bd73de6c167d9db9cdf", "base": "8dab9fd1ccf571e188eec9ccf606a0c50fccf200", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/65", "merged_by": null, "auto_merge": null} {"id": 346264926, "node_id": "MDExOlB1bGxSZXF1ZXN0MzQ2MjY0OTI2", "number": 67, "state": "closed", "locked": 0, "title": "Run tests against 3.5 too", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-11-27T14:20:35Z", "updated_at": "2019-12-31T01:29:44Z", "closed_at": "2019-12-31T01:29:43Z", "merged_at": null, "merge_commit_sha": "88375b0bc055067b996584f06ed85a9a90c5aa1a", "assignee": null, "milestone": null, "draft": 0, "head": "4c6e5a4486e0e17555774eb3279142234a8b4abc", "base": "0a0cec3cf27861455e8cd1c4d84937825a18bb30", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/67", "merged_by": null, "auto_merge": null} {"id": 357992588, "node_id": "MDExOlB1bGxSZXF1ZXN0MzU3OTkyNTg4", "number": 72, "state": "closed", "locked": 0, "title": "Fixed implementation of upsert", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #66", "created_at": "2019-12-30T05:08:05Z", "updated_at": "2019-12-30T05:29:24Z", "closed_at": "2019-12-30T05:29:24Z", "merged_at": "2019-12-30T05:29:24Z", "merge_commit_sha": "9f47e8b9a4cb788b48b76aee1333c6f3baaebbd6", "assignee": null, "milestone": null, "draft": 0, "head": "ab8a4bda75fc59871ba8445c6a0fb2332483029c", "base": "dc0a62556ec092be7b341c5220e0410354f7cd02", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/72", "merged_by": null, "auto_merge": null} {"id": 369348084, "node_id": "MDExOlB1bGxSZXF1ZXN0MzY5MzQ4MDg0", "number": 78, "state": "closed", "locked": 0, "title": "New conversions= feature, refs #77", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2020-01-31T00:02:33Z", "updated_at": "2020-09-22T07:48:29Z", "closed_at": "2020-01-31T00:24:31Z", "merged_at": "2020-01-31T00:24:31Z", "merge_commit_sha": "e8b2b7383bd94659d3b7a857a1414328bc48bc19", "assignee": null, "milestone": null, "draft": 0, "head": "58190d67821aaa57c8ca0320a08e3691d6e27344", "base": "59a2e8ebdcbde7e6fb091b0556713ca5a20ea4e7", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/78", "merged_by": null, "auto_merge": null} {"id": 369394043, "node_id": "MDExOlB1bGxSZXF1ZXN0MzY5Mzk0MDQz", "number": 80, "state": "closed", "locked": 0, "title": "on_create mechanism for after table creation", "user": {"value": 9599, "label": "simonw"}, "body": "I need this for `geojson-to-sqlite`, in particular https://github.com/simonw/geojson-to-sqlite/issues/6", "created_at": "2020-01-31T03:38:48Z", "updated_at": "2020-01-31T05:08:04Z", "closed_at": "2020-01-31T05:08:04Z", "merged_at": null, "merge_commit_sha": "e6dc95d19348e72b28b42e73a18737cb2e4563e0", "assignee": null, "milestone": null, "draft": 0, "head": "45bf0c25492c276bde0b85868ffb55f169375bd7", "base": "f7289174e66ae4d91d57de94bbd9d09fabf7aff4", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/80", "merged_by": null, "auto_merge": null} {"id": 481616704, "node_id": "MDExOlB1bGxSZXF1ZXN0NDgxNjE2NzA0", "number": 151, "state": "closed", "locked": 0, "title": "Tracer mechanism for seeing underlying SQL", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #150. Needs tests and documentation, including for the new `db.execute()` and `db.executescript()` methods.", "created_at": "2020-09-07T19:46:43Z", "updated_at": "2020-09-07T21:57:00Z", "closed_at": "2020-09-07T21:57:00Z", "merged_at": "2020-09-07T21:57:00Z", "merge_commit_sha": "cf2cb244faf992118f34aa196387a4ef8b39a20f", "assignee": null, "milestone": null, "draft": 0, "head": "dc82bf371911d01ac140f40ea99d06d2daee507e", "base": "3e87500e1561f5c4e105cd026d33e0f715cc7dea", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/151", "merged_by": null, "auto_merge": null} {"id": 490607949, "node_id": "MDExOlB1bGxSZXF1ZXN0NDkwNjA3OTQ5", "number": 161, "state": "closed", "locked": 0, "title": "table.transform() method", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #114\r\n\r\n- [x] Ability to change the primary key\r\n- [x] Support for changing default value for columns\r\n- [x] Support for changing `NOT NULL` status of columns\r\n- [x] Support for copying existing foreign keys and removing them\r\n- Support for `conversions=` parameter\r\n- [x] Detailed documentation\r\n- [x] `PRAGMA foreign_keys` stuff", "created_at": "2020-09-21T23:16:59Z", "updated_at": "2020-09-22T07:48:24Z", "closed_at": "2020-09-22T04:20:02Z", "merged_at": "2020-09-22T04:20:02Z", "merge_commit_sha": "987dd123f2ac43c5ab66d69e59d454fe09660606", "assignee": null, "milestone": {"value": 5897911, "label": "2.20"}, "draft": 0, "head": "dc3eb9c313502832c07f4de889aa60c373f45b52", "base": "ef882986d07f157b6bcc6be3d7b64270fda3e523", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/161", "merged_by": null, "auto_merge": null} {"id": 490703173, "node_id": "MDExOlB1bGxSZXF1ZXN0NDkwNzAzMTcz", "number": 166, "state": "closed", "locked": 0, "title": "Keyword only arguments for transform()", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #165", "created_at": "2020-09-22T05:41:44Z", "updated_at": "2020-09-22T06:39:11Z", "closed_at": "2020-09-22T06:39:11Z", "merged_at": "2020-09-22T06:39:10Z", "merge_commit_sha": "f8e10df00eae209fb0a1ea03384d9153f673a3ec", "assignee": null, "milestone": null, "draft": 0, "head": "f8648cac3a6dda90578a1536cdae44d145633a2c", "base": "987dd123f2ac43c5ab66d69e59d454fe09660606", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/166", "merged_by": null, "auto_merge": null} {"id": 492257405, "node_id": "MDExOlB1bGxSZXF1ZXN0NDkyMjU3NDA1", "number": 174, "state": "closed", "locked": 0, "title": "Much, much faster extract() implementation", "user": {"value": 9599, "label": "simonw"}, "body": "Takes my test down from ten minutes to four seconds. Refs #172.", "created_at": "2020-09-24T07:52:31Z", "updated_at": "2020-09-24T15:44:00Z", "closed_at": "2020-09-24T15:43:56Z", "merged_at": "2020-09-24T15:43:56Z", "merge_commit_sha": "022cdd97a9ddab1a152e23e1e1c42e78c1ed0fa9", "assignee": null, "milestone": null, "draft": 0, "head": "227095ee90e2a92effec6478d3e629a24d3ccfba", "base": "0ca5585fcb834122193e8e7186f926217b23cb8a", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/174", "merged_by": null, "auto_merge": null} {"id": 499603359, "node_id": "MDExOlB1bGxSZXF1ZXN0NDk5NjAzMzU5", "number": 184, "state": "closed", "locked": 0, "title": "Test against Python 3.9", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2020-10-08T01:37:05Z", "updated_at": "2020-10-08T01:44:06Z", "closed_at": "2020-10-08T01:44:06Z", "merged_at": "2020-10-08T01:44:06Z", "merge_commit_sha": "8e91de8e4edf6c8abeeccdf084b8870fff40a51a", "assignee": null, "milestone": null, "draft": 0, "head": "975c05b6dde9feebcdecabc047d47122ebcfdf84", "base": "7f4fe9190c1df7f0e72f9d7040327a43cf252c48", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/184", "merged_by": null, "auto_merge": null} {"id": 510956134, "node_id": "MDExOlB1bGxSZXF1ZXN0NTEwOTU2MTM0", "number": 190, "state": "closed", "locked": 0, "title": "Progress bar for sqlite-utils insert command", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #173", "created_at": "2020-10-27T18:08:53Z", "updated_at": "2020-10-27T18:16:03Z", "closed_at": "2020-10-27T18:16:03Z", "merged_at": "2020-10-27T18:16:03Z", "merge_commit_sha": "f99a23652910b03ac4669bbbb35a9b484451aabb", "assignee": null, "milestone": null, "draft": 0, "head": "62d678122a251812cd650845705ca7b9efcef86d", "base": "c7e5dd64513c0ec2b2df4c51c8df924c282417f9", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/190", "merged_by": null, "auto_merge": null} {"id": 515014883, "node_id": "MDExOlB1bGxSZXF1ZXN0NTE1MDE0ODgz", "number": 195, "state": "closed", "locked": 0, "title": "table.search() improvements plus sqlite-utils search command", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #192. Still needs tests.", "created_at": "2020-11-03T22:02:08Z", "updated_at": "2020-11-06T18:30:49Z", "closed_at": "2020-11-06T18:30:42Z", "merged_at": "2020-11-06T18:30:42Z", "merge_commit_sha": "d411fba1f4124047429ac9d1175a04b36bf5bee9", "assignee": null, "milestone": null, "draft": 0, "head": "973d94d44f27d35d856fe1cc822f9d5d40e4b5e6", "base": "59d8689ed0e6e042d99fd650896def680ca3c657", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/195", "merged_by": null, "auto_merge": null} {"id": 537791675, "node_id": "MDExOlB1bGxSZXF1ZXN0NTM3NzkxNjc1", "number": 208, "state": "closed", "locked": 0, "title": "sqlite-utils analyze-tables command and table.analyze_column() method", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #207\r\n\r\n- [x] Improve design of CLI output\r\n- [x] Truncate long values in least/most common\r\n- [x] Add a `-c` column selection option\r\n- [x] Tests\r\n- [x] Documentation", "created_at": "2020-12-12T05:27:49Z", "updated_at": "2020-12-13T07:20:16Z", "closed_at": "2020-12-13T07:20:12Z", "merged_at": "2020-12-13T07:20:12Z", "merge_commit_sha": "69a121e08847acbf95abf0c2df1759fc73dc81b8", "assignee": null, "milestone": null, "draft": 0, "head": "95a966bb6216215d40d0016d673a28b04428db43", "base": "c5f4f0f70ce394dfec6054c3c5aaedf330887093", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/208", "merged_by": null, "auto_merge": null} {"id": 573147168, "node_id": "MDExOlB1bGxSZXF1ZXN0NTczMTQ3MTY4", "number": 233, "state": "closed", "locked": 0, "title": "Run tests against Ubuntu, macOS and Windows", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #232", "created_at": "2021-02-14T20:11:02Z", "updated_at": "2021-02-14T20:39:54Z", "closed_at": "2021-02-14T20:39:54Z", "merged_at": "2021-02-14T20:39:54Z", "merge_commit_sha": "f51a1f6c3cb2929bcf79cb4efe3b2a9886d9c25c", "assignee": null, "milestone": null, "draft": 0, "head": "deb01a8913441e7fedb53c52a3a9fdff274ddbd2", "base": "320f3ac33a83b32f89559ef0c162b7eca428a278", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/233", "merged_by": null, "auto_merge": null} {"id": 580235427, "node_id": "MDExOlB1bGxSZXF1ZXN0NTgwMjM1NDI3", "number": 241, "state": "open", "locked": 0, "title": "Extract expand - work in progress", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #239. Still needs documentation and CLI implementation.", "created_at": "2021-02-25T16:36:38Z", "updated_at": "2021-02-25T16:36:38Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0bb6c7a38994627a64e7b3375931528e96b8c222", "assignee": null, "milestone": null, "draft": 1, "head": "8d641ab08ac449081e96f3e25bd6c0226870948a", "base": "38e688fb8bcb58ae888b676fe3f7dd0529b4eecc", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/241", "merged_by": null, "auto_merge": null} {"id": 657373726, "node_id": "MDExOlB1bGxSZXF1ZXN0NjU3MzczNzI2", "number": 262, "state": "closed", "locked": 0, "title": "Ability to add descending order indexes", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #260", "created_at": "2021-05-29T04:51:04Z", "updated_at": "2021-05-29T05:01:42Z", "closed_at": "2021-05-29T05:01:39Z", "merged_at": "2021-05-29T05:01:39Z", "merge_commit_sha": "51d01da30d45c1fbc1e587e6046a933529cf915e", "assignee": null, "milestone": null, "draft": 0, "head": "50a4fb722d29c3e53f7b148a41aeda901d02a264", "base": "b2302875c97f723e02cc39136d0b20fd706369aa", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/262", "merged_by": null, "auto_merge": null} {"id": 671014751, "node_id": "MDExOlB1bGxSZXF1ZXN0NjcxMDE0NzUx", "number": 273, "state": "closed", "locked": 0, "title": "sqlite-utils memory command for directly querying CSV/JSON data", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #272. Initial implementation only does CSV data, still needs:\r\n\r\n- [x] Implement `--save`\r\n- [x] Add `--dump` to the documentation\r\n- [x] Add `--attach` example to the documentation\r\n- [x] Replace `:memory:` in documentation", "created_at": "2021-06-16T05:04:58Z", "updated_at": "2021-06-18T15:01:17Z", "closed_at": "2021-06-18T15:00:52Z", "merged_at": "2021-06-18T15:00:52Z", "merge_commit_sha": "42ec59d8ee3fcfb8ac1affb772aed43b6e2a7381", "assignee": null, "milestone": null, "draft": 0, "head": "df7a37bdb730bb863fa29758f6fb35f809fa0dd0", "base": "78aebb6479420217454747870737bc593a259abc", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/273", "merged_by": null, "auto_merge": null} {"id": 677554929, "node_id": "MDExOlB1bGxSZXF1ZXN0Njc3NTU0OTI5", "number": 293, "state": "closed", "locked": 0, "title": "Test against Python 3.10-dev", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2021-06-25T01:40:39Z", "updated_at": "2021-10-13T21:49:33Z", "closed_at": "2021-10-13T21:49:33Z", "merged_at": null, "merge_commit_sha": "0f64d20b044ecb86d9e4e5843f9590006d2f39c2", "assignee": null, "milestone": null, "draft": 0, "head": "ae0f46a78958c0118e98c2ab18bd1b57a0478326", "base": "747be6057d09a4e5d9d726e29d5cf99b10c59dea", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/293", "merged_by": null, "auto_merge": null} {"id": 700944644, "node_id": "MDExOlB1bGxSZXF1ZXN0NzAwOTQ0NjQ0", "number": 303, "state": "closed", "locked": 0, "title": "sqlite-utils convert command and db[table].convert(...) method", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #251, #302.\r\n\r\n- [x] Get recipes working\r\n- [x] Document recipes\r\n- [x] Implement `db[table].convert(...)` method\r\n- [x] Add tests for recipes that use the new Python method\r\n- [x] Implement `db[table].convert(..., multi=True)` mechanism\r\n- [x] Documentation for `db[table].convert(...)`\r\n- [x] Refactor `sqlite-utils convert` to use the new method", "created_at": "2021-08-01T16:52:42Z", "updated_at": "2021-08-02T04:47:42Z", "closed_at": "2021-08-02T04:47:39Z", "merged_at": "2021-08-02T04:47:39Z", "merge_commit_sha": "5ec6686153e29ae10d4921a1ad4c841f192f20e2", "assignee": null, "milestone": null, "draft": 0, "head": "4c3bf9730542f1e49cbf11a61dbdb7fd621453df", "base": "c7e8d72be9fe8fe0811f685a18eebc637662d41b", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/303", "merged_by": null, "auto_merge": null} {"id": 707490789, "node_id": "MDExOlB1bGxSZXF1ZXN0NzA3NDkwNzg5", "number": 312, "state": "closed", "locked": 0, "title": "Add reference page to documentation using Sphinx autodoc", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #311.", "created_at": "2021-08-10T16:59:17Z", "updated_at": "2021-08-10T23:09:32Z", "closed_at": "2021-08-10T23:09:28Z", "merged_at": "2021-08-10T23:09:28Z", "merge_commit_sha": "6155da72c8939b5d9bdacb7853e5e8d1767ce1d5", "assignee": null, "milestone": null, "draft": 0, "head": "43bc06481783c3cfcee70c0cb541a686e8894adb", "base": "ee469e3122d6f5973ec2584c1580d930daca2e7c", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/312", "merged_by": null, "auto_merge": null} {"id": 719109709, "node_id": "MDExOlB1bGxSZXF1ZXN0NzE5MTA5NzA5", "number": 321, "state": "closed", "locked": 0, "title": "Ability to insert file contents as text, in addition to blob", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #319.", "created_at": "2021-08-24T22:37:18Z", "updated_at": "2021-08-24T23:31:17Z", "closed_at": "2021-08-24T23:31:13Z", "merged_at": "2021-08-24T23:31:13Z", "merge_commit_sha": "49a010c93d90bc68ce1c6fff7639927248912b54", "assignee": null, "milestone": null, "draft": 0, "head": "db2dd6d9f30b347f4ed22b07f59b5a615184fbfd", "base": "9258f4bd8450c951900de998a7bf81ca9b45a014", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/321", "merged_by": null, "auto_merge": null} {"id": 729731441, "node_id": "MDExOlB1bGxSZXF1ZXN0NzI5NzMxNDQx", "number": 326, "state": "closed", "locked": 0, "title": "Test against 3.10-dev", "user": {"value": 9599, "label": "simonw"}, "body": "This tests against the latest 3.10 RC, https://www.python.org/downloads/release/python-3100rc2/", "created_at": "2021-09-08T15:01:15Z", "updated_at": "2021-10-13T21:49:28Z", "closed_at": "2021-10-13T21:49:28Z", "merged_at": null, "merge_commit_sha": "c563260408e1b802cbbc81ec7c1e398350a1ca3a", "assignee": null, "milestone": null, "draft": 0, "head": "078a08765d8aefa5ce376a03b2643d4ebe1aa57e", "base": "77c240df56068341561e95e4a412cbfa24dc5bc7", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/326", "merged_by": null, "auto_merge": null} {"id": 757797315, "node_id": "PR_kwDOCGYnMM4tKxHD", "number": 330, "state": "closed", "locked": 0, "title": "Test against Python 3.10", "user": {"value": 9599, "label": "simonw"}, "body": null, "created_at": "2021-10-13T21:50:22Z", "updated_at": "2021-11-15T02:59:29Z", "closed_at": "2021-10-13T22:25:05Z", "merged_at": "2021-10-13T22:25:05Z", "merge_commit_sha": "fda4dad23a0494890267fbe8baf179e2b56ee914", "assignee": null, "milestone": null, "draft": 0, "head": "fc3de90963b6b097826d36f6a24c46267659dcf2", "base": "718a8f61bcaed39c04d5d223104056213f8c8516", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/330", "merged_by": null, "auto_merge": null} {"id": 791153878, "node_id": "PR_kwDOCGYnMM4vKAzW", "number": 347, "state": "open", "locked": 0, "title": "Test against pysqlite3 running SQLite 3.37", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #346 and #344.", "created_at": "2021-11-29T23:17:57Z", "updated_at": "2021-12-11T01:02:19Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "f70a61e58ae62e53af74ab48d742bdc335131fbd", "assignee": null, "milestone": null, "draft": 0, "head": "1a7ef2fe2064ace01d5535fb771f941296fb642a", "base": "213a0ff177f23a35f3b235386366ff132eb879f1", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/347", "merged_by": null, "auto_merge": null} {"id": 815164865, "node_id": "PR_kwDOCGYnMM4wlm3B", "number": 361, "state": "closed", "locked": 0, "title": "--lines and --text and --convert and --import", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #356\r\n\r\nStill TODO:\r\n\r\n- [x] Get `--lines` working, with tests\r\n- [x] Get `--text` working, with tests\r\n- [x] Get regular JSON import working with `--convert` with tests\r\n- [x] Get `--lines` working with `--convert` with tests\r\n- [x] Get `--text` working with `--convert` with tests\r\n- [x] Get `--csv` and `--tsv` import working with `--convert` with tests\r\n- [x] Get `--nl` working with `--convert` with tests\r\n- [x] Documentation for all of the above", "created_at": "2022-01-06T01:49:44Z", "updated_at": "2022-01-06T06:37:03Z", "closed_at": "2022-01-06T06:24:54Z", "merged_at": "2022-01-06T06:24:54Z", "merge_commit_sha": "413f8ed754e38d7b190de888c85fe8438336cb11", "assignee": null, "milestone": null, "draft": 0, "head": "b7f0b88d49032a053f0de2dbba356ee1f3b949c0", "base": "f3fd8613113d21d44238a6ec54b375f5aa72c4e0", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/361", "merged_by": null, "auto_merge": null} {"id": 816927546, "node_id": "PR_kwDOCGYnMM4wsVM6", "number": 367, "state": "closed", "locked": 0, "title": "Initial prototype of .analyze() methods", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #366", "created_at": "2022-01-08T21:35:12Z", "updated_at": "2022-01-10T19:31:08Z", "closed_at": "2022-01-10T19:31:08Z", "merged_at": null, "merge_commit_sha": "2ffcbed6787523649dd676985f3ea70a62944764", "assignee": null, "milestone": {"value": 7558727, "label": "3.21"}, "draft": 1, "head": "9848eaa61b43de0ddb74ff6d085bcb18f4640f91", "base": "a8f9cc6f64f299830834428509940d448b82b4ed", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/367", "merged_by": null, "auto_merge": null} {"id": 817257851, "node_id": "PR_kwDOCGYnMM4wtl17", "number": 377, "state": "closed", "locked": 0, "title": "`sqlite-utils bulk` command", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #375\r\n\r\nStill needs:\r\n\r\n- [x] Refactor `@insert_upsert_options` so that it doesn't duplicate `@import_options`\r\n- [x] Tests\r\n- [x] Documentation\r\n- [x] Try it against a really big file", "created_at": "2022-01-10T05:34:24Z", "updated_at": "2022-01-11T02:10:57Z", "closed_at": "2022-01-11T02:10:54Z", "merged_at": "2022-01-11T02:10:54Z", "merge_commit_sha": "129141572f249ea290e2a075437e2ebaad215859", "assignee": null, "milestone": {"value": 7558727, "label": "3.21"}, "draft": 0, "head": "f4ea0d32c0543373eefaa9b9f3911eb07549eecb", "base": "b6dad08a8389736b7e960cfe9bc719cfc21a98f5", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/377", "merged_by": null, "auto_merge": null} {"id": 925807233, "node_id": "PR_kwDOCGYnMM43LrKB", "number": 429, "state": "closed", "locked": 0, "title": "Depend on click-default-group-wheel", "user": {"value": 9599, "label": "simonw"}, "body": "Trying to get this to work with Pyodide.\r\n\r\nRefs: https://github.com/simonw/click-default-group-wheel/issues/3", "created_at": "2022-05-02T18:03:10Z", "updated_at": "2022-05-02T18:52:42Z", "closed_at": "2022-05-02T18:05:00Z", "merged_at": "2022-05-02T18:05:00Z", "merge_commit_sha": "ed6fd516082e8cc83b199798f62dd67728a6974f", "assignee": null, "milestone": null, "draft": 0, "head": "4a02dcf265702a4f11eed943bf8feaa502c590d5", "base": "e3a14c33a033b0c2fc00f2470666caaf9027e446", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/429", "merged_by": null, "auto_merge": null} {"id": 1009936222, "node_id": "PR_kwDOCGYnMM48Mmde", "number": 457, "state": "closed", "locked": 0, "title": "Link to installation instructions", "user": {"value": 9599, "label": "simonw"}, "body": "Also testing https://docs.readthedocs.io/en/stable/pull-requests.html", "created_at": "2022-07-27T17:38:36Z", "updated_at": "2022-08-27T03:55:52Z", "closed_at": "2022-07-27T17:57:50Z", "merged_at": "2022-07-27T17:57:50Z", "merge_commit_sha": "77ca051d4f5ddbd42fd6250749efac7ea85ea094", "assignee": null, "milestone": {"value": 8355157, "label": "3.29"}, "draft": 0, "head": "80b3907471f724aeecae75796663815c87731e77", "base": "9e6cceac1c0e086429e2d308b700e59cc53a1991", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/457", "merged_by": null, "auto_merge": null} {"id": 1015320511, "node_id": "PR_kwDOCGYnMM48hI-_", "number": 460, "state": "closed", "locked": 0, "title": "Cross-link CLI to Python docs", "user": {"value": 9599, "label": "simonw"}, "body": "Work in progress, partly to test the ReadTheDocs preview link action.\r\n\r\nRefs:\r\n- #426\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://readthedocs-preview--460.org.readthedocs.build/en/460/\n\r\n", "created_at": "2022-08-02T16:18:28Z", "updated_at": "2022-08-18T21:58:10Z", "closed_at": "2022-08-18T21:58:07Z", "merged_at": "2022-08-18T21:58:07Z", "merge_commit_sha": "f4fb78fa95057fbc86c734020835a3155695297f", "assignee": null, "milestone": null, "draft": 0, "head": "f21f4ccf7197e7a0ac8c2eb5086659fc3eb5bc05", "base": "1856002e3c0fcc9f09f72ab7d97ad8c75f6de7df", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/460", "merged_by": null, "auto_merge": null} {"id": 1015591301, "node_id": "PR_kwDOCGYnMM48iLGF", "number": 462, "state": "closed", "locked": 0, "title": "Discord badge", "user": {"value": 9599, "label": "simonw"}, "body": "Also testing fix for:\r\n- https://github.com/readthedocs/readthedocs-preview/issues/10\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--462.org.readthedocs.build/en/462/\n\r\n", "created_at": "2022-08-02T20:56:04Z", "updated_at": "2022-08-02T21:15:57Z", "closed_at": "2022-08-02T21:15:52Z", "merged_at": "2022-08-02T21:15:52Z", "merge_commit_sha": "271433fdd18e436b0a527ab899cb6f6fa67f23d0", "assignee": null, "milestone": null, "draft": 0, "head": "0a14a031385f2647be0b9d15d96c1d44d05c2296", "base": "98a28cbfe6cea67f6334b42b74f35b0ddd309561", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/462", "merged_by": null, "auto_merge": null} {"id": 1029360106, "node_id": "PR_kwDOCGYnMM49Wsnq", "number": 465, "state": "closed", "locked": 0, "title": "beanbag-docutils>=2.0", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #464", "created_at": "2022-08-17T22:41:39Z", "updated_at": "2022-08-17T23:38:07Z", "closed_at": "2022-08-17T23:38:02Z", "merged_at": "2022-08-17T23:38:02Z", "merge_commit_sha": "f8ffac8787e299a62c99ed1ce914cd5ace84ad94", "assignee": null, "milestone": null, "draft": 0, "head": "bb90d3326815a041512b40bf0cf53b3ace06cd67", "base": "45e24deffea042b5db7ab84cd1eb63b3ed9bb9da", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/465", "merged_by": null, "auto_merge": null} {"id": 1029373779, "node_id": "PR_kwDOCGYnMM49Wv9T", "number": 466, "state": "closed", "locked": 0, "title": "Use Read the Docs action v1 (#463)", "user": {"value": 9599, "label": "simonw"}, "body": "Read the Docs repository was renamed from `readthedocs/readthedocs-preview` to `readthedocs/actions/`. Now, the `preview` action is under `readthedocs/actions/preview` and is tagged as `v1`", "created_at": "2022-08-17T23:11:50Z", "updated_at": "2022-08-17T23:11:54Z", "closed_at": "2022-08-17T23:11:54Z", "merged_at": "2022-08-17T23:11:54Z", "merge_commit_sha": "bb90d3326815a041512b40bf0cf53b3ace06cd67", "assignee": null, "milestone": null, "draft": 0, "head": "83e7339255e811c62e6db8498c483c44a84d0f28", "base": "72655adabc596a9eed43cc11c07177a390791068", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/466", "merged_by": null, "auto_merge": null} {"id": 1034485141, "node_id": "PR_kwDOCGYnMM49qP2V", "number": 468, "state": "closed", "locked": 0, "title": "db[table].create(..., transform=True) and create-table --transform", "user": {"value": 9599, "label": "simonw"}, "body": "Work in progress. Still needs documentation and tests (and to cover more cases of things that might have changed).\r\n\r\nRefs:\r\n- #467\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://sqlite-utils--468.org.readthedocs.build/en/468/\r\n\r\n", "created_at": "2022-08-23T17:27:58Z", "updated_at": "2022-08-27T23:17:55Z", "closed_at": "2022-08-27T23:17:55Z", "merged_at": "2022-08-27T23:17:55Z", "merge_commit_sha": "104f37fa4d2e7e5999c1d829267b62c737f74d3e", "assignee": null, "milestone": {"value": 8355157, "label": "3.29"}, "draft": 0, "head": "2f6a64f61d561df821d737719941c678dcb1a03c", "base": "c5f8a2eb1a81a18b52825cc649112f71fe419b12", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/468", "merged_by": null, "auto_merge": null} {"id": 1038565427, "node_id": "PR_kwDOCGYnMM4950Az", "number": 473, "state": "closed", "locked": 0, "title": "Support entrypoints for `--load-extension`", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #470\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--473.org.readthedocs.build/en/473/\n\r\n", "created_at": "2022-08-27T05:53:59Z", "updated_at": "2022-08-27T05:55:52Z", "closed_at": "2022-08-27T05:55:47Z", "merged_at": "2022-08-27T05:55:47Z", "merge_commit_sha": "19dd077944429c1365b513d80cc71c605ae3bed3", "assignee": null, "milestone": null, "draft": 0, "head": "72db599ae03fabe2e9f999999e258edc1a99ed59", "base": "a46a5e3a9e03dcdd8c84a92e4a5dbfa02ba461fa", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/473", "merged_by": null, "auto_merge": null} {"id": 1358254580, "node_id": "PR_kwDOCGYnMM5Q9VH0", "number": 546, "state": "closed", "locked": 0, "title": "Analyze tables options: --common-limit, --no-most, --no-least", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #544\r\n\r\n- [x] Documentation for CLI options\r\n- [x] Documentation for new Python API parameters: `most_common: bool` and `least_common: bool`\r\n- [x] Tests for CLI\r\n- [x] Tests for Python API", "created_at": "2023-05-21T15:54:39Z", "updated_at": "2023-05-21T16:19:30Z", "closed_at": "2023-05-21T16:19:30Z", "merged_at": "2023-05-21T16:19:30Z", "merge_commit_sha": "d2a7b15b2b930fe384e1f1715fc4af23386f4935", "assignee": null, "milestone": null, "draft": 0, "head": "2eca17d46eca2cff52c78553085ec64d9029c969", "base": "e047cc32e9d5de7025d4d3c16554d4290f4bd3d1", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/546", "merged_by": null, "auto_merge": null} {"id": 1358282799, "node_id": "PR_kwDOCGYnMM5Q9cAv", "number": 549, "state": "closed", "locked": 0, "title": "TUI powered by Trogon", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #545\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--549.org.readthedocs.build/en/549/\n\r\n", "created_at": "2023-05-21T17:55:42Z", "updated_at": "2023-05-21T18:42:00Z", "closed_at": "2023-05-21T18:41:56Z", "merged_at": "2023-05-21T18:41:56Z", "merge_commit_sha": "718b0cba9b32d97a41bcf9757c97fe1d058da81c", "assignee": null, "milestone": null, "draft": 0, "head": "948692a94b22852b3147abebac9d719b69320b57", "base": "e8c5b042e49c627aefd620c8d4b1c84eb8677f73", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/549", "merged_by": null, "auto_merge": null} {"id": 1358321208, "node_id": "PR_kwDOCGYnMM5Q9lY4", "number": 553, "state": "closed", "locked": 0, "title": "Reformatted CLI examples in docs", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #551\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--553.org.readthedocs.build/en/553/\n\r\n", "created_at": "2023-05-21T20:44:34Z", "updated_at": "2023-05-21T20:57:27Z", "closed_at": "2023-05-21T20:57:23Z", "merged_at": "2023-05-21T20:57:22Z", "merge_commit_sha": "d8fe1b0d899faaaa3d4714a39328f4c24932278f", "assignee": null, "milestone": null, "draft": 0, "head": "21036a5084a2c846a05feb6bced3111d849bbe3c", "base": "e240133b11588d31dc22c632f7a7ca636c72978d", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/553", "merged_by": null, "auto_merge": null} {"id": 1406821147, "node_id": "PR_kwDOCGYnMM5T2mMb", "number": 560, "state": "closed", "locked": 0, "title": "Use sqlean if available in environment", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #559 \r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--560.org.readthedocs.build/en/560/\n\r\n", "created_at": "2023-06-25T19:48:48Z", "updated_at": "2023-06-26T08:21:00Z", "closed_at": "2023-06-25T23:25:51Z", "merged_at": "2023-06-25T23:25:51Z", "merge_commit_sha": "f5c63088e1454811ce8361208b72297408eb5237", "assignee": null, "milestone": null, "draft": 0, "head": "5e7d27e5df024ce1f45e3a850c4e0f65e765cccd", "base": "2747257a3334d55e890b40ec58fada57ae8cfbfd", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/560", "merged_by": null, "auto_merge": null} {"id": 1479795255, "node_id": "PR_kwDOCGYnMM5YM-I3", "number": 584, "state": "closed", "locked": 0, "title": ".transform() instead of modifying sqlite_master for add_foreign_keys", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #577\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--584.org.readthedocs.build/en/584/\n\r\n", "created_at": "2023-08-17T23:32:45Z", "updated_at": "2023-08-18T00:48:13Z", "closed_at": "2023-08-18T00:48:08Z", "merged_at": "2023-08-18T00:48:08Z", "merge_commit_sha": "509857ee8724f73760f3631b69c26f9047381187", "assignee": null, "milestone": null, "draft": 0, "head": "291505084e652972ad806383250757d41d596d38", "base": "1dc6b5aa644a92d3654f7068110ed7930989ce71", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/584", "merged_by": null, "auto_merge": null} {"id": 1504920193, "node_id": "PR_kwDOCGYnMM5Zs0KB", "number": 591, "state": "closed", "locked": 0, "title": "Test against Python 3.12 preview", "user": {"value": 9599, "label": "simonw"}, "body": "https://dev.to/hugovk/help-test-python-312-beta-1508/\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--591.org.readthedocs.build/en/591/\n\r\n", "created_at": "2023-09-06T16:10:00Z", "updated_at": "2023-11-04T00:58:03Z", "closed_at": "2023-11-04T00:58:02Z", "merged_at": null, "merge_commit_sha": "ac0db3c705355178bd5a337b8dd74df141b12c7a", "assignee": null, "milestone": null, "draft": 0, "head": "1f14df1de4a214b12abfba6edd61a4bfa0b8473e", "base": "347fdc865e91b8d3410f49a5c9d5b499fbb594c1", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/591", "merged_by": null, "auto_merge": null} {"id": 1507097949, "node_id": "PR_kwDOCGYnMM5Z1H1d", "number": 593, "state": "closed", "locked": 0, "title": ".transform() now preserves rowid values, refs #592", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #592\r\n\r\n- [x] Tests against weird shaped tables\r\n\r\nI need to test that this works against:\r\n\r\n- `rowid` tables\r\n- Tables that have a column called `rowid` even though they are not rowid tables\r\n\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://sqlite-utils--593.org.readthedocs.build/en/593/\r\n\r\n", "created_at": "2023-09-08T01:02:28Z", "updated_at": "2023-09-10T17:44:59Z", "closed_at": "2023-09-09T00:45:30Z", "merged_at": "2023-09-09T00:45:30Z", "merge_commit_sha": "1c6ea54338e24fcebcee4e2f9c170ee300a5d946", "assignee": null, "milestone": null, "draft": 0, "head": "b86374f705d1f4143a51634b30289cb48add0ea2", "base": "5d123f031fc4fadc98f508e0ef6b7b6671e86155", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/593", "merged_by": null, "auto_merge": null} {"id": 359822773, "node_id": "MDExOlB1bGxSZXF1ZXN0MzU5ODIyNzcz", "number": 75, "state": "closed", "locked": 0, "title": "Explicitly include tests and docs in sdist", "user": {"value": 15092, "label": "jayvdb"}, "body": "Also exclude 'tests' from runtime installation.", "created_at": "2020-01-07T04:53:20Z", "updated_at": "2020-01-31T00:21:27Z", "closed_at": "2020-01-31T00:21:27Z", "merged_at": "2020-01-31T00:21:27Z", "merge_commit_sha": "0988f2eccc2dfa26b1a55243582222f540a72838", "assignee": null, "milestone": null, "draft": 0, "head": "39a836450b23bf2fe1ba9a071a5a9a00a0949cd6", "base": "59a2e8ebdcbde7e6fb091b0556713ca5a20ea4e7", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/75", "merged_by": null, "auto_merge": null} {"id": 493162767, "node_id": "MDExOlB1bGxSZXF1ZXN0NDkzMTYyNzY3", "number": 178, "state": "closed", "locked": 0, "title": "Update README.md", "user": {"value": 19921, "label": "shakeel"}, "body": "The `sqlite-utils insert releases.db releases - --pk` is missing the pk field name, added ` \"id\"` to fix it.", "created_at": "2020-09-25T15:52:11Z", "updated_at": "2020-10-01T14:18:30Z", "closed_at": "2020-09-30T20:29:28Z", "merged_at": "2020-09-30T20:29:28Z", "merge_commit_sha": "cada1017edcfa691c2314d7ad1b7c7576495317f", "assignee": null, "milestone": null, "draft": 0, "head": "0c6a81dae802a55d5469c18cd32402d11b6e8a59", "base": "94fc62857ee2655a21d85f6dae84b67bbfa5956d", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/178", "merged_by": null, "auto_merge": null} {"id": 821992886, "node_id": "PR_kwDOCGYnMM4w_p22", "number": 385, "state": "closed", "locked": 0, "title": "Add new spatialite helper methods", "user": {"value": 25778, "label": "eyeseast"}, "body": "Refs #79 \r\n\r\nThis PR adds three new Spatialite-related methods to Database and Table:\r\n\r\n- `Database.init_spatialite` loads the Spatialite extension and initializes it\r\n- `Table.add_geometry_column` adds a geometry column\r\n- `Table.create_spatial_index` creates a spatial index\r\n\r\nHas tests and documentation. Feedback very welcome.", "created_at": "2022-01-14T03:57:30Z", "updated_at": "2022-02-05T00:04:26Z", "closed_at": "2022-02-04T05:55:10Z", "merged_at": "2022-02-04T05:55:10Z", "merge_commit_sha": "ee11274fcb1c00f32c95f2ef2924d5349538eb4d", "assignee": null, "milestone": null, "draft": 0, "head": "af86b17acf2fa50048e38b96497636d49db89766", "base": "74586d3cb26fa3cc3412721985ecdc1864c2a31d", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/385", "merged_by": null, "auto_merge": null} {"id": 853484980, "node_id": "PR_kwDOCGYnMM4y3yW0", "number": 407, "state": "closed", "locked": 0, "title": "Add SpatiaLite helpers to CLI", "user": {"value": 25778, "label": "eyeseast"}, "body": "Closes #398 \r\n\r\nThis adds SpatiaLite helpers to the CLI. \r\n\r\n```sh\r\n# init spatialite when creating a database\r\nsqlite-utils create database.db --enable-wal --init-spatialite\r\n\r\n# add geometry columns\r\n# needs a database, table, geometry column name, type, with optional SRID and not-null\r\n# this will throw an error if the table doesn't already exist\r\nsqlite-utils add-geometry-column database.db table-name geometry --srid 4326 --not-null\r\n\r\n# spatial index an existing table/column\r\n# this will throw an error it the table and column don't exist\r\nsqlite-utils create-spatial-index database.db table-name geometry\r\n```\r\n\r\nDocs and tests are included. ", "created_at": "2022-02-15T16:50:17Z", "updated_at": "2022-02-16T01:49:40Z", "closed_at": "2022-02-16T00:58:08Z", "merged_at": "2022-02-16T00:58:07Z", "merge_commit_sha": "a692c56659c3563b26dcdc9e3534d63ecc26e180", "assignee": null, "milestone": null, "draft": 0, "head": "a974da591915e0548182bbbf01da34ecb9e537e6", "base": "e7f040106b5f5a892ebd984f19b21c605e87c142", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/407", "merged_by": null, "auto_merge": null} {"id": 887534558, "node_id": "PR_kwDOCGYnMM405rPe", "number": 419, "state": "closed", "locked": 0, "title": "Ignore common generated files", "user": {"value": 25778, "label": "eyeseast"}, "body": "Closes #418 \r\n\r\nThis adds four files to `.gitignore`:\r\n\r\n\t.hypothesis/\r\n\tPipfile\r\n\tPipfile.lock\r\n\tpyproject.toml\r\n\r\nThose are all generated in the course of development and testing.", "created_at": "2022-03-23T18:06:22Z", "updated_at": "2022-03-24T21:01:44Z", "closed_at": "2022-03-24T21:01:44Z", "merged_at": "2022-03-24T21:01:44Z", "merge_commit_sha": "396f80fcc60da8dd844577114f7920830a2e5403", "assignee": null, "milestone": null, "draft": 0, "head": "228f73615cf993dd3caf3c240682c00392832bb8", "base": "93fa79d30b1531bea281d0eb6b925c4e61bc1aa6", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/419", "merged_by": null, "auto_merge": null} {"id": 1272169404, "node_id": "PR_kwDOCGYnMM5L08O8", "number": 531, "state": "closed", "locked": 0, "title": "Add paths for homebrew on Apple silicon", "user": {"value": 25778, "label": "eyeseast"}, "body": "This also passes in the extension path when specified in GIS methods. Wherever we know an extension path, we use `db.init_spatialite(find_spatialite() or load_extension)`.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--531.org.readthedocs.build/en/531/\n\r\n", "created_at": "2023-03-11T22:27:52Z", "updated_at": "2023-04-09T01:49:44Z", "closed_at": "2023-04-09T01:49:43Z", "merged_at": null, "merge_commit_sha": "24f3eb082b98b8d676bab2eab4f763cd9b50fe96", "assignee": null, "milestone": null, "draft": 0, "head": "afdf6187716b19fce8692f6887a1d45c85477fee", "base": "c0251cc9271260de73b4227859a51fab9b4cb745", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/531", "merged_by": null, "auto_merge": null} {"id": 1306498393, "node_id": "PR_kwDOCGYnMM5N35VZ", "number": 536, "state": "closed", "locked": 0, "title": "Add paths for homebrew on Apple silicon", "user": {"value": 25778, "label": "eyeseast"}, "body": "Does what it says and nothing else. This is the same set of paths as Datasette uses.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--536.org.readthedocs.build/en/536/\n\r\n", "created_at": "2023-04-08T13:34:21Z", "updated_at": "2023-04-13T01:44:43Z", "closed_at": "2023-04-13T01:44:43Z", "merged_at": "2023-04-13T01:44:43Z", "merge_commit_sha": "8f9a729e8aff972cb18de25b40f4113e26bbc758", "assignee": null, "milestone": null, "draft": 0, "head": "cea05dc5eab8d10fbd8943e615d2ab0dceff863c", "base": "c0251cc9271260de73b4227859a51fab9b4cb745", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/536", "merged_by": null, "auto_merge": null} {"id": 510235909, "node_id": "MDExOlB1bGxSZXF1ZXN0NTEwMjM1OTA5", "number": 189, "state": "closed", "locked": 0, "title": "Allow iterables other than Lists in m2m records", "user": {"value": 35681, "label": "adamwolf"}, "body": "I was playing around with sqlite-utils, creating a Roam Research dogsheep-style importer for Datasette, and ran into a slight snag.\r\n\r\nI wanted to use a generator to add an order column in an importer. It looked something like:\r\n\r\n```\r\ndef order_generator(iterable, attr=None):\r\n if attr is None:\r\n attr = \"order\"\r\n order: int = 0\r\n\r\n for i in iterable:\r\n i[attr] = order\r\n order += 1\r\n yield i\r\n```\r\n\r\nWhen I used this with `insert_all` and other things, it worked fine--but it didn't work as the `records` argument to `m2m`. I dug into it, and sqlite-utils is explicitly checking if the records argument is a list or a tuple. I flipped the check upside down, and now it checks if the argument is a mapping. If it's a mapping, it wraps it in a list, otherwise it leaves it alone.\r\n\r\n(I get that it might not really make sense to put the order column on the second table. I changed my import schema a bit, and no longer have a real example, but maybe this change still makes sense.)\r\n\r\nThe automated tests still pass, but I did not add any new ones.\r\n\r\nLet me know what you think! I'm really loving Datasette and its ecosystem; thanks for everything!", "created_at": "2020-10-26T18:47:44Z", "updated_at": "2020-10-27T16:28:37Z", "closed_at": "2020-10-27T16:24:21Z", "merged_at": "2020-10-27T16:24:21Z", "merge_commit_sha": "f045d8559a6d2cb922a2de30fbcc896a4486b82f", "assignee": null, "milestone": null, "draft": 0, "head": "93230b2acb61635b6d5070ad9c65e7221c63b75a", "base": "e4f1c7b936981de29823730c5dbef4f4ba7a4286", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/189", "merged_by": null, "auto_merge": null} {"id": 313007483, "node_id": "MDExOlB1bGxSZXF1ZXN0MzEzMDA3NDgz", "number": 56, "state": "closed", "locked": 0, "title": "Escape the table name in populate_fts and search.", "user": {"value": 49260, "label": "amjith"}, "body": "The table names weren't escaped using double quotes in the populate_fts method. \r\n\r\nReproducible case: \r\n```\r\n>>> import sqlite_utils\r\n>>> db = sqlite_utils.Database(\"abc.db\")\r\n>>> db[\"http://example.com\"].insert_all([\r\n... {\"id\": 1, \"age\": 4, \"name\": \"Cleo\"},\r\n... {\"id\": 2, \"age\": 2, \"name\": \"Pancakes\"}\r\n... ], pk=\"id\")\r\n\r\n>>> db[\"http://example.com\"].enable_fts([\"name\"])\r\nTraceback (most recent call last):\r\n File \"\", line 1, in \r\n db[\"http://example.com\"].enable_fts([\"name\"])\r\n File \"/home/amjith/.virtualenvs/itsysearch/lib/python3.7/site-packages/sqlite_utils/db.py\", l\r\nine 705, in enable_fts\r\n self.populate_fts(columns)\r\n File \"/home/amjith/.virtualenvs/itsysearch/lib/python3.7/site-packages/sqlite_utils/db.py\", l\r\nine 715, in populate_fts\r\n self.db.conn.executescript(sql)\r\nsqlite3.OperationalError: unrecognized token: \":\"\r\n>>> \r\n```", "created_at": "2019-09-01T06:29:05Z", "updated_at": "2019-09-02T17:23:21Z", "closed_at": "2019-09-02T17:23:21Z", "merged_at": null, "merge_commit_sha": "79852e97ecb69b88da87da0cba2a55887cf83bda", "assignee": null, "milestone": null, "draft": 0, "head": "83ca4c802f5d5102e73ff366e61514ded81dc7a1", "base": "cb70f7d10996b844154bf3da88779dd1f65590bc", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/56", "merged_by": null, "auto_merge": null} {"id": 313105634, "node_id": "MDExOlB1bGxSZXF1ZXN0MzEzMTA1NjM0", "number": 57, "state": "closed", "locked": 0, "title": "Add triggers while enabling FTS", "user": {"value": 49260, "label": "amjith"}, "body": "This adds the option for a user to set up triggers in the database to keep their FTS table in sync with the parent table. \r\n\r\nRef: https://sqlite.org/fts5.html#external_content_and_contentless_tables\r\n\r\nI would prefer to make the creation of triggers the default behavior, but that will break existing usage where people have been calling `populate_fts` after inserting new rows.\r\n\r\nI am happy to make changes to the PR as you see fit. ", "created_at": "2019-09-02T04:23:40Z", "updated_at": "2019-09-03T01:03:59Z", "closed_at": "2019-09-02T23:42:29Z", "merged_at": "2019-09-02T23:42:29Z", "merge_commit_sha": "405e092d5916e70df10f82d15e9c052aa9ee8d80", "assignee": null, "milestone": null, "draft": 0, "head": "e01943271b17115fbe0e81d523126d2fb1c7c24b", "base": "cb70f7d10996b844154bf3da88779dd1f65590bc", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/57", "merged_by": null, "auto_merge": null} {"id": 249680944, "node_id": "MDExOlB1bGxSZXF1ZXN0MjQ5NjgwOTQ0", "number": 9, "state": "closed", "locked": 0, "title": ":pencil: Updates my_database.py to my_database.db", "user": {"value": 50527, "label": "jefftriplett"}, "body": "I noticed that both `.py` and `.db` were used in the docs and assumed you'd prefer `.db`. ", "created_at": "2019-02-01T17:35:43Z", "updated_at": "2019-02-24T03:55:04Z", "closed_at": "2019-02-24T03:55:04Z", "merged_at": "2019-02-24T03:55:04Z", "merge_commit_sha": "c5068a0972651b3e359ebc2d6c1486b8b7d2c242", "assignee": null, "milestone": null, "draft": 0, "head": "1ad604fbbd3311f041357190796a3613c0c729d1", "base": "441c131db5cc68e197db19f0623ff8a96c90c3ff", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/9", "merged_by": null, "auto_merge": null} {"id": 1542299634, "node_id": "PR_kwDOCGYnMM5b7Z_y", "number": 598, "state": "closed", "locked": 0, "title": "Fixed issue #433 - CLI eats cursor", "user": {"value": 62745, "label": "spookylukey"}, "body": "The issue is that underlying iterator is not fully consumed within the body of the `with file_progress()` block. Instead, that block creates generator expressions like `docs = (dict(zip(headers, row)) for row in reader)`\r\n\r\nThese iterables are consumed later, outside the `with file_progress()` block, which consumes the underlying iterator, and in turn updates the progress bar.\r\n\r\nThis means that the `ProgressBar.__exit__` method gets called before the last time the `ProgressBar.update` method gets called. The result is that the code to make the cursor invisible (inside the `update()` method) is called after the cleanup code to make it visible (in the `__exit__` method).\r\n\r\nThe fix is to move consumption of the `docs` iterators within the progress bar block. (\r\n\r\n(An additional fix, to make ProgressBar more robust against this kind of misuse, would to make it refusing to update after its `__exit__` method had been called, just like files cannot be `read()` after they are closed. That requires a in the click library).\r\n\r\nNote that Github diff obscures the simplicity of this diff, it's just indenting a block of code.\r\n\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--598.org.readthedocs.build/en/598/\n\r\n", "created_at": "2023-10-04T18:06:58Z", "updated_at": "2023-11-04T00:46:55Z", "closed_at": "2023-11-04T00:40:30Z", "merged_at": "2023-11-04T00:40:30Z", "merge_commit_sha": "37273d7f63f08872aa1c90c4233a0580e384ac19", "assignee": null, "milestone": null, "draft": 0, "head": "76113d1cb1387811d556fb7a32e0628492c34aea", "base": "622c3a5a7dd53a09c029e2af40c2643fe7579340", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/598", "merged_by": null, "auto_merge": null} {"id": 529090560, "node_id": "MDExOlB1bGxSZXF1ZXN0NTI5MDkwNTYw", "number": 204, "state": "closed", "locked": 0, "title": "use jsonify_if_need for sql updates", "user": {"value": 78035, "label": "mfa"}, "body": "", "created_at": "2020-11-29T10:49:00Z", "updated_at": "2020-12-08T17:49:42Z", "closed_at": "2020-12-08T17:49:42Z", "merged_at": "2020-12-08T17:49:42Z", "merge_commit_sha": "c5f4f0f70ce394dfec6054c3c5aaedf330887093", "assignee": null, "milestone": null, "draft": 0, "head": "8ea9ad1913aa63395391818ebb4e43bfce936dda", "base": "60d3c4821be4cf25c41097c1e8b79b2e60c5ead5", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/204", "merged_by": null, "auto_merge": null} {"id": 445023326, "node_id": "MDExOlB1bGxSZXF1ZXN0NDQ1MDIzMzI2", "number": 118, "state": "closed", "locked": 0, "title": "Add insert --truncate option", "user": {"value": 79913, "label": "tsibley"}, "body": "\r\n\r\nDeletes all rows in the table (if it exists) before inserting new rows.\r\nSQLite doesn't implement a TRUNCATE TABLE statement but does optimize an\r\nunqualified DELETE FROM.\r\n\r\nThis can be handy if you want to refresh the entire contents of a table\r\nbut a) don't have a PK (so can't use --replace), b) don't want the table\r\nto disappear (even briefly) for other connections, and c) have to handle\r\nrecords that used to exist being deleted.\r\n\r\nIdeally the replacement of rows would appear instantaneous to other\r\nconnections by putting the DELETE + INSERT in a transaction, but this is\r\nvery difficult without breaking other code as the current transaction\r\nhandling is inconsistent and non-systematic. There exists the\r\npossibility for the DELETE to succeed but the INSERT to fail, leaving an\r\nempty table. This is not much worse, however, than the current\r\npossibility of one chunked INSERT succeeding and being committed while\r\nthe next chunked INSERT fails, leaving a partially complete operation.", "created_at": "2020-07-06T21:58:40Z", "updated_at": "2020-07-08T17:26:21Z", "closed_at": "2020-07-08T17:26:21Z", "merged_at": "2020-07-08T17:26:21Z", "merge_commit_sha": "ae4593316ccf5e42ad26f27033193834a7e696c8", "assignee": null, "milestone": null, "draft": 0, "head": "332f7d770b84734dbed4842ab3ed24ee5b687889", "base": "f8277d0fb9c05a88a9ff01d996e31d55f0f0a645", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/118", "merged_by": null, "auto_merge": null} {"id": 445833908, "node_id": "MDExOlB1bGxSZXF1ZXN0NDQ1ODMzOTA4", "number": 120, "state": "closed", "locked": 0, "title": "Fix query command's support for DML", "user": {"value": 79913, "label": "tsibley"}, "body": "See commit messages for details. I ran into this while investigating another feature/issue.", "created_at": "2020-07-08T01:36:34Z", "updated_at": "2020-07-08T05:14:04Z", "closed_at": "2020-07-08T05:14:04Z", "merged_at": "2020-07-08T05:14:04Z", "merge_commit_sha": "f8277d0fb9c05a88a9ff01d996e31d55f0f0a645", "assignee": null, "milestone": null, "draft": 0, "head": "6a660d12a27864d6ab552e11eef9fd13bc281198", "base": "d0cdaaaf00249230e847be3a3b393ee2689fbfe4", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/120", "merged_by": null, "auto_merge": null} {"id": 475665984, "node_id": "MDExOlB1bGxSZXF1ZXN0NDc1NjY1OTg0", "number": 142, "state": "closed", "locked": 0, "title": "insert_all(..., alter=True) should work for new columns introduced after the first 100 records", "user": {"value": 96218, "label": "simonwiles"}, "body": "Closes #139.", "created_at": "2020-08-28T22:22:57Z", "updated_at": "2020-08-30T07:28:23Z", "closed_at": "2020-08-28T22:30:14Z", "merged_at": "2020-08-28T22:30:14Z", "merge_commit_sha": "947bb7626fd1763608a470adf9cf5f156ef003e9", "assignee": null, "milestone": null, "draft": 0, "head": "1b992c7c1e5855caa87c7939efad287052f446f3", "base": "ea87c2b943fdd162c42a900ac0aea5ecc2f4b9d9", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/142", "merged_by": null, "auto_merge": null} {"id": 475874493, "node_id": "MDExOlB1bGxSZXF1ZXN0NDc1ODc0NDkz", "number": 146, "state": "closed", "locked": 0, "title": "Handle case where subsequent records (after first batch) include extra columns", "user": {"value": 96218, "label": "simonwiles"}, "body": "Addresses #145.\r\n\r\nI think this should do the job. If it meets with your approval I'll update this PR to include an update to the documentation -- I came across this bug while preparing a PR to update the documentation around `batch_size` in any event.", "created_at": "2020-08-30T07:13:58Z", "updated_at": "2020-09-08T23:20:37Z", "closed_at": "2020-09-08T23:20:37Z", "merged_at": "2020-09-08T23:20:36Z", "merge_commit_sha": "e6d202b742a7b531fffa593703d34f8337632d68", "assignee": null, "milestone": null, "draft": 0, "head": "40fcea41525682fdc2f601da787b29d5a8517dcd", "base": "deb2eb013ff85bbc828ebc244a9654f0d9c3139e", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/146", "merged_by": null, "auto_merge": null} {"id": 483027587, "node_id": "MDExOlB1bGxSZXF1ZXN0NDgzMDI3NTg3", "number": 156, "state": "closed", "locked": 0, "title": "Typos in tests", "user": {"value": 96218, "label": "simonwiles"}, "body": "One of these is my fault, and the other is one I just happened to come across. They're harmless, but might as well be fixed.", "created_at": "2020-09-09T18:00:58Z", "updated_at": "2020-09-09T18:24:50Z", "closed_at": "2020-09-09T18:21:23Z", "merged_at": "2020-09-09T18:21:23Z", "merge_commit_sha": "367082e787101fb90901ef3214804ab23a92ce46", "assignee": null, "milestone": null, "draft": 0, "head": "b777776753ef08f35dfaa7d86b2d5082e8904f27", "base": "6be61263642d8e46ec54cf5f51af74e0df2f2393", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/156", "merged_by": null, "auto_merge": null} {"id": 737050557, "node_id": "PR_kwDOCGYnMM4r7n-9", "number": 327, "state": "closed", "locked": 0, "title": "Extract expand: Support JSON Arrays", "user": {"value": 101753, "label": "phaer"}, "body": "Hi,\r\n\r\nI needed to extract data in JSON Arrays to normalize data imports. I've quickly hacked the following together based on #241 which refers to #239 where you, @simonw, wrote:\r\n\r\n> Could this handle lists of objects too? That would be pretty amazing - if the column has a [{...}, {...}] list in it could turn that into a many-to-many.\r\n\r\nThey way this works in my work is that many-to-many relationships are created for anything that maps to an dictionary in a list, and many-to-one relations for everything else (assumed to be scalar values). Not sure what the best approach here would be? Are many-to-one relationships are at all useful here?\r\n\r\nWhat do you think about this approach? I could try to add it to the cli interface and documentation if wanted.\r\n\r\nThanks for this awesome piece of software in any case! :sun_with_face: ", "created_at": "2021-09-19T10:34:30Z", "updated_at": "2022-12-29T09:05:36Z", "closed_at": "2022-12-29T09:05:36Z", "merged_at": null, "merge_commit_sha": "f0105cde23452cb4c8a15fc6096154b15d9b7c5a", "assignee": null, "milestone": null, "draft": 0, "head": "2840c697aa9817462d864ed5f8a7696d749fe039", "base": "8d641ab08ac449081e96f3e25bd6c0226870948a", "author_association": "NONE", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/327", "merged_by": null, "auto_merge": null} {"id": 943686022, "node_id": "PR_kwDOCGYnMM44P4GG", "number": 437, "state": "closed", "locked": 0, "title": "docs to dogs", "user": {"value": 114388, "label": "yurivish"}, "body": "Fixes a typo.", "created_at": "2022-05-22T15:50:33Z", "updated_at": "2022-05-30T21:32:41Z", "closed_at": "2022-05-30T21:32:41Z", "merged_at": "2022-05-30T21:32:41Z", "merge_commit_sha": "9fedfc69d7239ac49900051e1c48ee9cdd470d9e", "assignee": null, "milestone": null, "draft": 0, "head": "9e540417821385939db0fdd2d0a859f85be377e6", "base": "59be60c471fd7a2c4be7f75e8911163e618ff5ca", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/437", "merged_by": null, "auto_merge": null} {"id": 483175509, "node_id": "MDExOlB1bGxSZXF1ZXN0NDgzMTc1NTA5", "number": 158, "state": "closed", "locked": 0, "title": "Fix accidental mega long line in docs", "user": {"value": 167319, "label": "tomviner"}, "body": "", "created_at": "2020-09-09T22:31:23Z", "updated_at": "2020-09-16T06:21:43Z", "closed_at": "2020-09-16T06:21:43Z", "merged_at": "2020-09-16T06:21:43Z", "merge_commit_sha": "7805d53bcf11199bd1f2b07e05ae90151f9d0eb0", "assignee": null, "milestone": null, "draft": 0, "head": "5c1d8a5f3ac8684657eefe4f57ff5ff605f6b633", "base": "367082e787101fb90901ef3214804ab23a92ce46", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/158", "merged_by": null, "auto_merge": null} {"id": 1234321667, "node_id": "PR_kwDOCGYnMM5JkkED", "number": 526, "state": "closed", "locked": 0, "title": "Fix repeated calls to `Table.convert()`", "user": {"value": 167893, "label": "mcarpenter"}, "body": "Fixes #525. All tests pass.\r\n\r\nThere's perhaps a better way to name lambdas? There could be a collision if a caller passes a function with name like `lambda_123456`.\r\n\r\nSQLite [documentation](https://www.sqlite.org/appfunc.html) is a little, ah, lite on function name specs. If there is a character that can be used in place of underscore in a SQLite function name that is not permitted in a Python function identifier then that could be a good way to prevent accidental collisions. (I tried dash, colon, dot, no joy).\r\n\r\nOtherwise, there is little chance of this happening and if it should happen the risk is mitigated by now throwing an exception in the case of a (name, arity) collision without `replace=True`.\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://sqlite-utils--526.org.readthedocs.build/en/526/\r\n\r\n", "created_at": "2023-02-09T00:14:49Z", "updated_at": "2023-05-08T21:56:05Z", "closed_at": "2023-05-08T21:53:58Z", "merged_at": "2023-05-08T21:53:58Z", "merge_commit_sha": "02f5c4d69d7b4baebde015c56e5bc62923f33314", "assignee": null, "milestone": null, "draft": 0, "head": "486e0cc1cd67e98c22d1f125403144cdedfa3d58", "base": "fc221f9b62ed8624b1d2098e564f525c84497969", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/526", "merged_by": null, "auto_merge": null} {"id": 1235909998, "node_id": "PR_kwDOCGYnMM5Jqn1u", "number": 528, "state": "closed", "locked": 0, "title": "Enable `Table.convert()` on falsey values", "user": {"value": 167893, "label": "mcarpenter"}, "body": "Fixes #527\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--528.org.readthedocs.build/en/528/\n\r\n", "created_at": "2023-02-10T00:04:09Z", "updated_at": "2023-05-08T21:08:23Z", "closed_at": "2023-05-08T21:08:23Z", "merged_at": null, "merge_commit_sha": "279fb2c85c6b3fc7b593aaf4245bd3a038bff5f0", "assignee": null, "milestone": null, "draft": 0, "head": "a09df3844ab91b70cebb7b888fc07cb21dffd01c", "base": "fc221f9b62ed8624b1d2098e564f525c84497969", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/528", "merged_by": null, "auto_merge": null} {"id": 727012996, "node_id": "MDExOlB1bGxSZXF1ZXN0NzI3MDEyOTk2", "number": 324, "state": "closed", "locked": 0, "title": "Use python-dateutil package instead of dateutils", "user": {"value": 191622, "label": "meatcar"}, "body": "While working on updating `sqlite-utils` for NixOS/Nixpkgs, I came a cross the following:\r\n\r\nIn 5ec6686153e29ae10d4921a1ad4c841f192f20e2, a new dependency was added on `dateutils` (https://pypi.org/project/dateutils/). \r\n\r\nI believe this is unintentional, and instead `python-dateutil` (https://pypi.org/project/python-dateutil/) was intended.\r\n\r\nMy reasoning is:\r\n- `python-dateutil` is imported here in [recipes.py](https://github.com/simonw/sqlite-utils/blob/5ec6686153e29ae10d4921a1ad4c841f192f20e2/sqlite_utils/recipes.py#L1) \r\n- The `mypy` `type-python-dateutil` dependency in [setup.py](https://github.com/simonw/sqlite-utils/blob/5ec6686153e29ae10d4921a1ad4c841f192f20e2/setup.py#L36)\r\n- `python-dateutil` is a dependency of `dateutils` as seen in the output in [docs/tutorial.ipynb](https://github.com/simonw/sqlite-utils/blob/77c240df56068341561e95e4a412cbfa24dc5bc7/docs/tutorial.ipynb#L43)\r\n\r\nSeems like the trailing \"s\" seems to be the source of confusion \ud83d\ude05\r\n\r\nI've swapped the dependencies out, hope this helps.", "created_at": "2021-09-03T18:31:19Z", "updated_at": "2021-11-14T23:25:40Z", "closed_at": "2021-11-14T23:25:40Z", "merged_at": "2021-11-14T23:25:40Z", "merge_commit_sha": "bc4c42d68879c710c851dba3c98deda96ca6caa8", "assignee": null, "milestone": null, "draft": 0, "head": "275ac3b282947fa5df5d18de835d5d958a778e72", "base": "77c240df56068341561e95e4a412cbfa24dc5bc7", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/324", "merged_by": null, "auto_merge": null} {"id": 1136499802, "node_id": "PR_kwDOCGYnMM5DvZxa", "number": 515, "state": "closed", "locked": 0, "title": "upsert new rows with constraints, fixes #514", "user": {"value": 193185, "label": "cldellow"}, "body": "This fixes #514 by making the initial insert for upserts include all columns, so that new rows can be added to tables with non-pkey columns that have constraints.\r\n\r\n(aside: I'm not a python programmer. `pip`? `pipenv`? `venv`? These are mystical incantations to me. The process to set up this repo for local development and testing was _so easy_. Thank you for the excellent contributing documentation!)\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://sqlite-utils--515.org.readthedocs.build/en/515/\r\n\r\n", "created_at": "2022-11-26T16:15:21Z", "updated_at": "2023-05-08T21:27:11Z", "closed_at": "2023-05-08T21:27:10Z", "merged_at": null, "merge_commit_sha": "c3713ef6944cbeacf36e462712cecac2176db692", "assignee": null, "milestone": null, "draft": 0, "head": "32f8173a8fe830c224e39a0a514cd12e78de7028", "base": "965ca0d5f5bffe06cc02cd7741344d1ddddf9d56", "author_association": "NONE", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/515", "merged_by": null, "auto_merge": null} {"id": 1022525059, "node_id": "PR_kwDOCGYnMM488n6D", "number": 463, "state": "closed", "locked": 0, "title": "Use Read the Docs action v1", "user": {"value": 244656, "label": "humitos"}, "body": "Read the Docs repository was renamed from `readthedocs/readthedocs-preview` to `readthedocs/actions/`. Now, the `preview` action is under `readthedocs/actions/preview` and is tagged as `v1`\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--463.org.readthedocs.build/en/463/\n\r\n", "created_at": "2022-08-10T10:31:47Z", "updated_at": "2022-08-18T08:30:14Z", "closed_at": "2022-08-17T23:11:16Z", "merged_at": "2022-08-17T23:11:16Z", "merge_commit_sha": "83e7339255e811c62e6db8498c483c44a84d0f28", "assignee": null, "milestone": null, "draft": 0, "head": "364110b97bd1c6e0d2bc841730e5dc1a595e537d", "base": "271433fdd18e436b0a527ab899cb6f6fa67f23d0", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/463", "merged_by": null, "auto_merge": null} {"id": 564215011, "node_id": "MDExOlB1bGxSZXF1ZXN0NTY0MjE1MDEx", "number": 225, "state": "closed", "locked": 0, "title": "fix for problem in Table.insert_all on search for columns per chunk of rows", "user": {"value": 261237, "label": "nieuwenhoven"}, "body": "Hi,\r\n\r\nI ran into a problem when trying to create a database from my Apple Healthkit data using [healthkit-to-sqlite](https://github.com/dogsheep/healthkit-to-sqlite). The program crashed because of an invalid insert statement that was generated for table `rDistanceCycling`. \r\n\r\nThe actual problem turned out to be in [sqlite-utils](https://github.com/simonw/sqlite-utils). `Table.insert_all` processes the data to be inserted in chunks of rows and checks for every chunk which columns are used, and it will collect all column names in the variable `all_columns`. The collection of columns is done using a nested list comprehension that is not completely correct. \r\n\r\nI'm using a Windows machine and had to make a few adjustments to the tests in order to be able to run them because they had a posix dependency.\r\n\r\nThanks, kind regards,\r\n\r\nFrans\r\n\r\n```\r\n# this is a (condensed) chunk of data from my Apple healthkit export that caused the problem.\r\n# the 3 last items in the chunk have additional keys: metadata_HKMetadataKeySyncVersion and metadata_HKMetadataKeySyncIdentifier\r\n\r\nchunk = [{'sourceName': 'Apple\u00c2\\xa0Watch van Frans', 'sourceVersion': '7.0.1',\r\n 'device': '<, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch3,4, software:7.0.1>',\r\n 'unit': 'km', 'creationDate': '2020-10-10 12:29:09 +0100', 'startDate': '2020-10-10 12:29:06 +0100',\r\n 'endDate': '2020-10-10 12:29:07 +0100', 'value': '0.00518016'},\r\n {'sourceName': 'Apple\u00c2\\xa0Watch van Frans', 'sourceVersion': '7.0.1',\r\n 'device': '<, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch3,4, software:7.0.1>',\r\n 'unit': 'km', 'creationDate': '2020-10-10 12:29:10 +0100', 'startDate': '2020-10-10 12:29:07 +0100',\r\n 'endDate': '2020-10-10 12:29:08 +0100', 'value': '0.00544049'},\r\n {'sourceName': 'Apple\u00c2\\xa0Watch van Frans', 'sourceVersion': '6.2.6',\r\n 'device': '<, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch3,4, software:6.2.6>',\r\n 'unit': 'km', 'creationDate': '2020-10-14 05:54:12 +0100', 'startDate': '2020-07-15 16:40:50 +0100',\r\n 'endDate': '2020-07-15 16:42:49 +0100', 'value': '0.952092', 'metadata_HKMetadataKeySyncVersion': '1',\r\n 'metadata_HKMetadataKeySyncIdentifier': '3:674DBCDB-3FE8-40D1-9FC1-E54A2B413805:616520450.99823:616520569.99360:119'},\r\n {'sourceName': 'Apple\u00c2\\xa0Watch van Frans', 'sourceVersion': '6.2.6',\r\n 'device': '<, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch3,4, software:6.2.6>',\r\n 'unit': 'km', 'creationDate': '2020-10-14 05:54:12 +0100', 'startDate': '2020-07-15 16:42:49 +0100',\r\n 'endDate': '2020-07-15 16:44:51 +0100', 'value': '0.848983', 'metadata_HKMetadataKeySyncVersion': '1',\r\n 'metadata_HKMetadataKeySyncIdentifier': '3:674DBCDB-3FE8-40D1-9FC1-E54A2B413805:616520569.99360:616520691.98826:119'},\r\n {'sourceName': 'Apple\u00c2\\xa0Watch van Frans', 'sourceVersion': '6.2.6',\r\n 'device': '<, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch3,4, software:6.2.6>',\r\n 'unit': 'km', 'creationDate': '2020-10-14 05:54:12 +0100', 'startDate': '2020-07-15 16:44:51 +0100',\r\n 'endDate': '2020-07-15 16:46:50 +0100', 'value': '0.834403', 'metadata_HKMetadataKeySyncVersion': '1',\r\n 'metadata_HKMetadataKeySyncIdentifier': '3:674DBCDB-3FE8-40D1-9FC1-E54A2B413805:616520691.98826:616520810.98305:119'}]\r\n\r\n\r\n\r\ndef all_columns_old():\r\n all_columns = [col for col in chunk[0]]\r\n all_columns += [column for record in chunk\r\n for column in record if column not in all_columns]\r\n return all_columns\r\n\r\n\r\ndef all_columns_new():\r\n all_columns = [col for col in chunk[0]]\r\n for record in chunk:\r\n all_columns += [column for column in record if column not in all_columns]\r\n return all_columns\r\n\r\n\r\n\r\nif __name__ == '__main__':\r\n from pprint import pprint\r\n\r\n print('problem: ')\r\n pprint(all_columns_old())\r\n print('\\nfix: ')\r\n pprint(all_columns_new())\r\n\r\n```\r\n", "created_at": "2021-01-29T20:16:07Z", "updated_at": "2021-02-14T21:04:13Z", "closed_at": "2021-02-14T21:04:13Z", "merged_at": null, "merge_commit_sha": "1cba965a1ddc2bd77db3bc3912aa7e8467e2fa2f", "assignee": null, "milestone": null, "draft": 0, "head": "929ea7551135df0cc2ac9d67f4fbbecf701a11f6", "base": "36dc7e3909a44878681c266b90f9be76ac749f2d", "author_association": "NONE", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/225", "merged_by": null, "auto_merge": null} {"id": 583407989, "node_id": "MDExOlB1bGxSZXF1ZXN0NTgzNDA3OTg5", "number": 244, "state": "closed", "locked": 0, "title": "Typo in upsert example", "user": {"value": 387669, "label": "j-e-d"}, "body": "Remove extra `[`", "created_at": "2021-03-02T23:14:14Z", "updated_at": "2021-05-19T02:58:21Z", "closed_at": "2021-05-19T02:58:21Z", "merged_at": "2021-05-19T02:58:21Z", "merge_commit_sha": "328211eaca1247cd6b33a2c0a54642f87866d85b", "assignee": null, "milestone": null, "draft": 0, "head": "1899200fa5a43f638573ea2c483df62819ba53b1", "base": "09c3386f55f766b135b6a1c00295646c4ae29bec", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/244", "merged_by": null, "auto_merge": null} {"id": 1000800283, "node_id": "PR_kwDOCGYnMM47pwAb", "number": 455, "state": "closed", "locked": 0, "title": "in extract code, check equality with IS instead of = for nulls", "user": {"value": 536941, "label": "fgregg"}, "body": "sqlite \"IS\" is equivalent to SQL \"IS NOT DISTINCT FROM\"\r\n\r\ncloses #423", "created_at": "2022-07-19T13:40:25Z", "updated_at": "2022-08-27T14:45:03Z", "closed_at": "2022-08-27T14:45:03Z", "merged_at": "2022-08-27T14:45:03Z", "merge_commit_sha": "c5f8a2eb1a81a18b52825cc649112f71fe419b12", "assignee": null, "milestone": null, "draft": 0, "head": "1b35a92e3ede76f0f29f6f8dcd899f44b2abbb02", "base": "855bce8c3823718def13e0b8928c58bf857e41b2", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/455", "merged_by": null, "auto_merge": null} {"id": 1311438738, "node_id": "PR_kwDOCGYnMM5OKveS", "number": 537, "state": "closed", "locked": 0, "title": "Support self-referencing FKs in `Table.create`", "user": {"value": 544011, "label": "numist"}, "body": "\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--537.org.readthedocs.build/en/537/\n\r\n", "created_at": "2023-04-12T20:26:58Z", "updated_at": "2023-05-08T22:45:33Z", "closed_at": "2023-05-08T21:10:01Z", "merged_at": "2023-05-08T21:10:01Z", "merge_commit_sha": "39ef137e6760d385dc48d03eccf9b89943636fc7", "assignee": null, "milestone": null, "draft": 0, "head": "a75abeb61b91a28650d3b9933e7ec80ad0d92529", "base": "c0251cc9271260de73b4227859a51fab9b4cb745", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/537", "merged_by": null, "auto_merge": null} {"id": 672359609, "node_id": "MDExOlB1bGxSZXF1ZXN0NjcyMzU5NjA5", "number": 277, "state": "closed", "locked": 0, "title": "add -h support closes #276", "user": {"value": 601708, "label": "mcint"}, "body": "This appears to be the [canonical solution](https://click.palletsprojects.com/en/7.x/documentation/#help-parameter-customization).", "created_at": "2021-06-17T08:08:26Z", "updated_at": "2021-06-18T14:56:59Z", "closed_at": "2021-06-18T14:56:59Z", "merged_at": "2021-06-18T14:56:59Z", "merge_commit_sha": "aa652b6afe43d2b40fabc7a513c3e68866e030a5", "assignee": null, "milestone": null, "draft": 0, "head": "abbd324a2178f09b19966ec36ab2f584d1824c59", "base": "a19ce1a4d0048d389411cfe11a5dbe4c503720e1", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/277", "merged_by": null, "auto_merge": null} {"id": 774610166, "node_id": "PR_kwDOCGYnMM4uK5z2", "number": 337, "state": "closed", "locked": 0, "title": "Default values for `--attach` and `--param` options", "user": {"value": 771193, "label": "urbas"}, "body": "It seems that `click` 8.x uses `None` as the default value for `multiple=True` options.\r\n\r\nThis change makes the code forward-compatible with `click` 8.x.\r\n\r\nSee this build failure for more info: https://hydra.nixos.org/build/156926608", "created_at": "2021-11-05T21:57:53Z", "updated_at": "2021-11-05T22:33:03Z", "closed_at": "2021-11-05T22:33:02Z", "merged_at": null, "merge_commit_sha": "eb8bf28da1794638a5693043cd5268f506a674d3", "assignee": null, "milestone": null, "draft": 0, "head": "095fc64c5399d75d44d304571a21293d06d817f0", "base": "fda4dad23a0494890267fbe8baf179e2b56ee914", "author_association": "NONE", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/337", "merged_by": null, "auto_merge": null} {"id": 521287994, "node_id": "MDExOlB1bGxSZXF1ZXN0NTIxMjg3OTk0", "number": 203, "state": "open", "locked": 0, "title": "changes to allow for compound foreign keys", "user": {"value": 1049910, "label": "drkane"}, "body": "Add support for compound foreign keys, as per issue #117 \r\n\r\nNot sure if this is the right approach. In particular I'm unsure about:\r\n\r\n - the new `ForeignKey` class, which replaces the namedtuple in order to ensure that `column` and `other_column` are forced into tuples. The class does the job, but doesn't feel very elegant.\r\n - I haven't rewritten `guess_foreign_table` to take account of multiple columns, so it just checks for the first column in the foreign key definition. This isn't ideal.\r\n - I haven't added any ability to the CLI to add compound foreign keys, it's only in the python API at the moment.\r\n\r\nThe PR also contains a minor related change that columns and tables are always quoted in foreign key definitions.", "created_at": "2020-11-16T00:30:10Z", "updated_at": "2023-01-25T18:47:18Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0507a9464314f84e9e58b1931c583df51d757d7c", "assignee": null, "milestone": null, "draft": 0, "head": "5e43e31c2b9bcf6b5d1460b0f848fed019ed42a6", "base": "f1277f638f3a54a821db6e03cb980adad2f2fa35", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/203", "merged_by": null, "auto_merge": null} {"id": 592289324, "node_id": "MDExOlB1bGxSZXF1ZXN0NTkyMjg5MzI0", "number": 245, "state": "closed", "locked": 0, "title": "Correct some typos", "user": {"value": 1076745, "label": "dbready"}, "body": "Noticed a typo in the docs and followed that up with a spellcheck. Had to bite my tongue at some of the British spellings.", "created_at": "2021-03-13T04:26:56Z", "updated_at": "2021-05-19T02:58:04Z", "closed_at": "2021-05-19T02:58:04Z", "merged_at": "2021-05-19T02:58:04Z", "merge_commit_sha": "3e62ab62a88992d4bbb0fe83debec3bacd93ebf3", "assignee": null, "milestone": null, "draft": 0, "head": "79de6b639f9d14818a5006af4f63e4e20c961a10", "base": "22f1d9e1999f70af4c5b0f880a820cd9eead3942", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/245", "merged_by": null, "auto_merge": null} {"id": 992299943, "node_id": "PR_kwDOCGYnMM47JUun", "number": 452, "state": "closed", "locked": 0, "title": "Add duplicate table feature", "user": {"value": 1690072, "label": "davidleejy"}, "body": "This PR addresses a feature request raised in issue #449. Specifically this PR adds a functionality that lets users duplicate a table via:\r\n\r\n```python\r\ntable_new = db[\"my_table\"].duplicate(\"new_table\")\r\n```\r\n\r\nTest added in file `tests/test_duplicate.py`.\r\n\r\nHappy to make changes to meet maintainers' feedback, if any. ", "created_at": "2022-07-09T20:24:31Z", "updated_at": "2022-07-15T21:21:37Z", "closed_at": "2022-07-15T21:21:36Z", "merged_at": "2022-07-15T21:21:36Z", "merge_commit_sha": "b366e68deb0780048a23610c279552f8529d4726", "assignee": null, "milestone": null, "draft": 0, "head": "eef350fe543c6301c61b257c5f708e0e16ed5a34", "base": "42440d6345c242ee39778045e29143fb550bd2c2", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/452", "merged_by": null, "auto_merge": null} {"id": 614727036, "node_id": "MDExOlB1bGxSZXF1ZXN0NjE0NzI3MDM2", "number": 254, "state": "closed", "locked": 0, "title": "Fix incorrect create-table cli description", "user": {"value": 1935268, "label": "robjwells"}, "body": "The description for `create-table` was duplicated from `create-index`.", "created_at": "2021-04-13T20:03:15Z", "updated_at": "2021-05-19T04:43:46Z", "closed_at": "2021-05-19T02:57:26Z", "merged_at": "2021-05-19T02:57:26Z", "merge_commit_sha": "e7b2626291040b78b9a2dbc2982ba72691fb1a0f", "assignee": null, "milestone": null, "draft": 0, "head": "cdeb7d7da77c6d1cd3554d08cb5659243cb3d55b", "base": "22f1d9e1999f70af4c5b0f880a820cd9eead3942", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/254", "merged_by": null, "auto_merge": null} {"id": 768796296, "node_id": "PR_kwDOCGYnMM4t0uaI", "number": 333, "state": "closed", "locked": 0, "title": "Add functionality to read Parquet files.", "user": {"value": 2118708, "label": "Florents-Tselai"}, "body": "I needed this for a project of mine, and I thought it'd be useful to have it in sqlite-utils (It's also mentioned in #248 ).\r\nThe current implementation works (data is read & data types are inferred correctly.\r\nI've added a single straightforward test case, but @simonw please let me know if there are any non-obvious flags/combinations I should test too.", "created_at": "2021-10-28T23:43:19Z", "updated_at": "2021-11-25T19:47:35Z", "closed_at": "2021-11-25T19:47:35Z", "merged_at": null, "merge_commit_sha": "eda2b1f8d2670c6ca8512e3e7c0150866bd0bdc6", "assignee": null, "milestone": null, "draft": 0, "head": "50ec2e49dee3b09a48a7aef55eceaa3f752a52e7", "base": "fda4dad23a0494890267fbe8baf179e2b56ee914", "author_association": "NONE", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/333", "merged_by": null, "auto_merge": null} {"id": 719998225, "node_id": "MDExOlB1bGxSZXF1ZXN0NzE5OTk4MjI1", "number": 322, "state": "closed", "locked": 0, "title": "Add dict type to be mapped as TEXT in sqllite", "user": {"value": 2496189, "label": "minaeid90"}, "body": "the library deal with Postgres type jsonb as dictionary, add dict type as a TEXT for mapping to sqlite\r\n\r\n", "created_at": "2021-08-25T20:54:26Z", "updated_at": "2021-11-15T00:27:40Z", "closed_at": "2021-11-15T00:27:40Z", "merged_at": "2021-11-15T00:27:40Z", "merge_commit_sha": "271b894af52eb6437ae6cd84eba9867ad8dd43f6", "assignee": null, "milestone": null, "draft": 0, "head": "69619f68c26478fdee479110e084fd22711013a3", "base": "77c240df56068341561e95e4a412cbfa24dc5bc7", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/322", "merged_by": null, "auto_merge": null} {"id": 1535767490, "node_id": "PR_kwDOCGYnMM5bifPC", "number": 596, "state": "closed", "locked": 0, "title": "Fixes mapping for time fields related to mysql, closes #522", "user": {"value": 4420927, "label": "nezhar"}, "body": "Adds `COLUMN_TYPE_MAPPING` for `TIME` fields that are mapped as `datetime.timedelta` for MySQL and json represantation for `datetime.timedelta` in order to fix #522\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--596.org.readthedocs.build/en/596/\n\r\n", "created_at": "2023-09-29T13:41:48Z", "updated_at": "2023-11-04T00:49:50Z", "closed_at": "2023-11-04T00:49:50Z", "merged_at": "2023-11-04T00:49:50Z", "merge_commit_sha": "347fdc865e91b8d3410f49a5c9d5b499fbb594c1", "assignee": null, "milestone": null, "draft": 0, "head": "ab12125b3f7d0ef327b08d95f27c6c4cec6fdfb3", "base": "622c3a5a7dd53a09c029e2af40c2643fe7579340", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/596", "merged_by": null, "auto_merge": null} {"id": 623755723, "node_id": "MDExOlB1bGxSZXF1ZXN0NjIzNzU1NzIz", "number": 258, "state": "closed", "locked": 0, "title": "Fixing insert from JSON containing strings with non-ascii characters \u2026", "user": {"value": 6586811, "label": "dylan-wu"}, "body": "\u2026are escaped aps unicode for lists, tuples, dicts\r\n\r\nFix of #257 ", "created_at": "2021-04-26T20:50:00Z", "updated_at": "2021-05-19T02:47:44Z", "closed_at": "2021-05-19T02:47:44Z", "merged_at": "2021-05-19T02:47:44Z", "merge_commit_sha": "6f4f9a3effeb16de0348d3cf136664f7531f498d", "assignee": null, "milestone": null, "draft": 0, "head": "27e7c1ae1913e2127361af4fc664c2061fb76627", "base": "22f1d9e1999f70af4c5b0f880a820cd9eead3942", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/258", "merged_by": null, "auto_merge": null} {"id": 1040691996, "node_id": "PR_kwDOCGYnMM4-B7Mc", "number": 480, "state": "closed", "locked": 0, "title": "search_sql add include_rank option", "user": {"value": 7908073, "label": "chapmanjacobd"}, "body": "I haven't tested this yet but wanted to get a heads-up whether this kind of change would be useful or if I should just duplicate the function and tweak it within my code\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--480.org.readthedocs.build/en/480/\n\r\n", "created_at": "2022-08-30T09:10:29Z", "updated_at": "2022-08-31T03:40:35Z", "closed_at": "2022-08-31T03:40:35Z", "merged_at": "2022-08-31T03:40:35Z", "merge_commit_sha": "ecf1d40112e52a8f4e509c39b98caae996b7bc36", "assignee": null, "milestone": null, "draft": 0, "head": "3dbfca6fdd878ba381f83157fdae2042eeaed371", "base": "087753cd42c406f1e060c1822dcd9b5fda3d60f4", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/480", "merged_by": null, "auto_merge": null} {"id": 1082769953, "node_id": "PR_kwDOCGYnMM5AicIh", "number": 498, "state": "closed", "locked": 0, "title": "fix: enable-fts permanently save triggers", "user": {"value": 7908073, "label": "chapmanjacobd"}, "body": "I was wondering why my all my databases were giving wild search results. Turns out create_trigger was not sticking!\r\n\r\nRunning `sqlite-utils triggers x.db` shows `[]` after running `enable-fts` using the python api. Looking at the counts trigger it seems that is the right way to save triggers. triggers show up now\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--498.org.readthedocs.build/en/498/\n\r\n", "created_at": "2022-10-11T05:10:51Z", "updated_at": "2022-10-15T04:33:08Z", "closed_at": "2022-10-11T06:34:31Z", "merged_at": null, "merge_commit_sha": "ab24d21e9c2aa9c514c3b65f05cfc0bafa7621c1", "assignee": null, "milestone": null, "draft": 0, "head": "75577e595d9177177a48030a1c39573af010df51", "base": "d792dad1cf5f16525da81b1e162fb71d469995f3", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/498", "merged_by": null, "auto_merge": null}