id,node_id,number,state,locked,title,user,user_label,body,created_at,updated_at,closed_at,merged_at,merge_commit_sha,assignee,assignee_label,milestone,milestone_label,draft,head,base,author_association,repo,repo_label,url,merged_by,merged_by_label,auto_merge 205770996,MDExOlB1bGxSZXF1ZXN0MjA1NzcwOTk2,1,closed,0,Make .indexes compatible with older SQLite versions,9599,simonw,Older SQLite versions return a different set of columns from the PRAGMA we are using.,2018-08-02T15:17:05Z,2018-08-02T15:17:30Z,2018-08-02T15:17:30Z,2018-08-02T15:17:30Z,741e8f7fe563e18fe9a12ac1ce38157e8c903505,,,,,0,9e674311065b8372f0a93becc8e7357ceffd353b,0aa28293adedc488eb9107dc52b5e9a124887fbd,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/1,,, 247576942,MDExOlB1bGxSZXF1ZXN0MjQ3NTc2OTQy,4,closed,0,Fts5,9599,simonw,,2019-01-25T06:54:05Z,2019-01-25T06:54:33Z,2019-01-25T06:54:33Z,2019-01-25T06:54:33Z,42b2b4b785e3163371e92a9cc085bc47e7c83107,,,,,0,7f205d2308443557bcaec497b3d0badc0dc26f06,ccb2a1e729780689188005a52c362b7e963f71e8,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/4,,, 247861419,MDExOlB1bGxSZXF1ZXN0MjQ3ODYxNDE5,5,closed,0,Run Travis tests against Python 3.8-dev,9599,simonw,,2019-01-26T02:30:55Z,2019-01-26T02:37:54Z,2019-01-26T02:37:54Z,2019-01-26T02:37:54Z,3a944d0c077c203277f13dd69387eb84b5c88d3e,,,,,0,b2f81e86074526d6e4dc9e39e791deff195669de,9a4d1ff0a268c7df7839389acd92d48752d24b95,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/5,,, 249680944,MDExOlB1bGxSZXF1ZXN0MjQ5NjgwOTQ0,9,closed,0,:pencil: Updates my_database.py to my_database.db,50527,jefftriplett,I noticed that both `.py` and `.db` were used in the docs and assumed you'd prefer `.db`. ,2019-02-01T17:35:43Z,2019-02-24T03:55:04Z,2019-02-24T03:55:04Z,2019-02-24T03:55:04Z,c5068a0972651b3e359ebc2d6c1486b8b7d2c242,,,,,0,1ad604fbbd3311f041357190796a3613c0c729d1,441c131db5cc68e197db19f0623ff8a96c90c3ff,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/9,,, 255658112,MDExOlB1bGxSZXF1ZXN0MjU1NjU4MTEy,12,closed,0,"Support for numpy types, closes #11",9599,simonw,,2019-02-24T03:57:32Z,2019-02-24T04:02:20Z,2019-02-24T04:02:20Z,2019-02-24T04:02:20Z,e615d22c5564ea1f32abb086088b2700110be10a,,,,,0,7c20e60685088d6da0739749305215790ca8375a,c5068a0972651b3e359ebc2d6c1486b8b7d2c242,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/12,,, 292879204,MDExOlB1bGxSZXF1ZXN0MjkyODc5MjA0,32,closed,0,db.add_foreign_keys() method,9599,simonw,"Refs #31. Still TODO: - [x] Unit tests - [x] Documentation",2019-06-28T15:40:33Z,2019-06-29T06:27:39Z,2019-06-29T06:27:39Z,2019-06-29T06:27:39Z,997d8758fc8992be93d5984556e5b9e3bad4205f,,,,,0,fc81588cc31df58374c996884c67cedd98a06f4a,86bd2bba689e25f09551d611ccfbee1e069e5b66,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/32,,, 293117183,MDExOlB1bGxSZXF1ZXN0MjkzMTE3MTgz,34,closed,0,sqlite-utils index-foreign-keys / db.index_foreign_keys(),9599,simonw,"Refs #33 - [x] `sqlite-utils index-foreign-keys` command - [x] `db.index_foreign_keys()` method - [x] unit tests - [x] documentation",2019-06-30T16:43:40Z,2019-06-30T23:50:55Z,2019-06-30T23:50:55Z,2019-06-30T23:50:54Z,e8f887ef4a0977243811b90bc2ce9aed9d2c206a,,,,,0,d82b000e3d55067516e2ce42f131cf4695e80dca,0fe3b38290e1bb2d92746d90318d8662b57218bd,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/34,,, 297412464,MDExOlB1bGxSZXF1ZXN0Mjk3NDEyNDY0,38,closed,0,table.update() method,9599,simonw,"Refs #35 Still to do: - [x] Unit tests - [x] Switch to using `.get()` - [x] Better exceptions, plus unit tests for what happens if pk does not exist - [x] Documentation - [x] Ensure compound primary keys work properly - [x] `alter=True` support",2019-07-14T17:03:49Z,2019-07-28T15:43:51Z,2019-07-28T15:43:51Z,2019-07-28T15:43:51Z,0747dabb24b608e8524de4858ce50c60ba7e471b,,,,,0,16d7008002b43cf47a973791da93e5cdd5913fc3,a6749cdf43229c4f7864c946496e9ac0141627d9,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/38,,, 297459797,MDExOlB1bGxSZXF1ZXN0Mjk3NDU5Nzk3,40,closed,0,.get() method plus support for compound primary keys,9599,simonw,"- [x] Tests for the `NotFoundError` exception - [x] Documentation for `.get()` method - [x] Support `--pk` multiple times to define CLI compound primary keys - [x] Documentation for compound primary keys",2019-07-15T03:43:13Z,2019-07-15T04:28:57Z,2019-07-15T04:28:52Z,2019-07-15T04:28:52Z,c65b67ca46f70e2da46a5b945f4ed358173262e9,,,,,0,b5a5df6d0ed47f33f6e1b4873948ead9a7c71060,65b2156d9cc0aa6b5c3dc7a6bd600d98b281a13b,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/40,,, 300286535,MDExOlB1bGxSZXF1ZXN0MzAwMjg2NTM1,45,closed,0,"Implemented table.lookup(...), closes #44",9599,simonw,,2019-07-23T13:03:30Z,2019-07-23T13:07:00Z,2019-07-23T13:07:00Z,2019-07-23T13:07:00Z,580502431614d3653c93249988290265f3163d4b,,,,,0,c0852ce018425450d6c040040f32729d41ff635c,f3a4c3d3ee6475a6caf3c9606656dbaf1df020b7,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/45,,, 300377599,MDExOlB1bGxSZXF1ZXN0MzAwMzc3NTk5,47,closed,0,extracts= table parameter,9599,simonw,Still needs docs. Refs #46,2019-07-23T16:30:29Z,2019-07-23T17:00:43Z,2019-07-23T17:00:43Z,2019-07-23T17:00:43Z,941d281aee6eac20ad64b505511da7e47f697700,,,,,0,1c9d08f75a48b2a3770f2a880462dc8b195289b7,e22cfcd953f967f6e9551b3a048d7c40726f349b,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/47,,, 301824097,MDExOlB1bGxSZXF1ZXN0MzAxODI0MDk3,51,closed,0,"Fix for too many SQL variables, closes #50",9599,simonw,,2019-07-28T11:30:30Z,2019-07-28T11:59:32Z,2019-07-28T11:59:32Z,2019-07-28T11:59:32Z,9cb045284ede8009c12abdb1755b5b20f6ccff5f,,,,,0,0c1b8b7f96be874bb63801f69323960f277aa49a,9b7be79c86b4283f24a64f62257c918f12542997,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/51,,, 303990683,MDExOlB1bGxSZXF1ZXN0MzAzOTkwNjgz,53,closed,0,Work in progress: m2m() method for creating many-to-many records,9599,simonw,"- [x] `table.insert({""name"": ""Barry""}).m2m(""tags"", lookup={""tag"": ""Coworker""})` - [x] Explicit table name `.m2m(""humans"", ..., m2m_table=""relationships"")` - [x] Automatically use an existing m2m table if a single obvious candidate exists (a table with two foreign keys in the correct directions) - [x] Require the explicit `m2m_table=` argument if multiple candidates for the m2m table exist - [x] Documentation Refs #23",2019-08-03T10:03:56Z,2019-08-04T03:38:10Z,2019-08-04T03:37:33Z,2019-08-04T03:37:33Z,4c0912dbf27b12071aca9569bcf7233e60f91c7c,,,,,0,243bcaa1acd32a173c07b24dca553991493005a0,e1021030dd2d8d4705ad0e7bae389eeaea7fa17b,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/53,,, 308292447,MDExOlB1bGxSZXF1ZXN0MzA4MjkyNDQ3,55,closed,0,Ability to introspect and run queries against views,9599,simonw,See #54 ,2019-08-17T13:40:56Z,2019-08-23T12:19:42Z,2019-08-23T12:19:42Z,2019-08-23T12:19:42Z,9faa98222669723d31e918bb16a42c13c363817f,,,,,0,4441d6d838fd7518ce715184361f549a04ec8b70,0e7b461eb3e925aef713206c15794ceae9259c57,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/55,,, 313007483,MDExOlB1bGxSZXF1ZXN0MzEzMDA3NDgz,56,closed,0,Escape the table name in populate_fts and search.,49260,amjith,"The table names weren't escaped using double quotes in the populate_fts method. Reproducible case: ``` >>> import sqlite_utils >>> db = sqlite_utils.Database(""abc.db"") >>> db[""http://example.com""].insert_all([ ... {""id"": 1, ""age"": 4, ""name"": ""Cleo""}, ... {""id"": 2, ""age"": 2, ""name"": ""Pancakes""} ... ], pk=""id"") >>> db[""http://example.com""].enable_fts([""name""]) Traceback (most recent call last): File """", line 1, in db[""http://example.com""].enable_fts([""name""]) File ""/home/amjith/.virtualenvs/itsysearch/lib/python3.7/site-packages/sqlite_utils/db.py"", l ine 705, in enable_fts self.populate_fts(columns) File ""/home/amjith/.virtualenvs/itsysearch/lib/python3.7/site-packages/sqlite_utils/db.py"", l ine 715, in populate_fts self.db.conn.executescript(sql) sqlite3.OperationalError: unrecognized token: "":"" >>> ```",2019-09-01T06:29:05Z,2019-09-02T17:23:21Z,2019-09-02T17:23:21Z,,79852e97ecb69b88da87da0cba2a55887cf83bda,,,,,0,83ca4c802f5d5102e73ff366e61514ded81dc7a1,cb70f7d10996b844154bf3da88779dd1f65590bc,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/56,,, 313105634,MDExOlB1bGxSZXF1ZXN0MzEzMTA1NjM0,57,closed,0,Add triggers while enabling FTS,49260,amjith,"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. Ref: https://sqlite.org/fts5.html#external_content_and_contentless_tables I 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. I am happy to make changes to the PR as you see fit. ",2019-09-02T04:23:40Z,2019-09-03T01:03:59Z,2019-09-02T23:42:29Z,2019-09-02T23:42:29Z,405e092d5916e70df10f82d15e9c052aa9ee8d80,,,,,0,e01943271b17115fbe0e81d523126d2fb1c7c24b,cb70f7d10996b844154bf3da88779dd1f65590bc,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/57,,, 313383317,MDExOlB1bGxSZXF1ZXN0MzEzMzgzMzE3,60,closed,0,db.triggers and table.triggers introspection,9599,simonw,Closes #59,2019-09-03T00:04:32Z,2019-09-03T00:09:42Z,2019-09-03T00:09:42Z,2019-09-03T00:09:42Z,2ca63e3b2de5408a860c6c7c1852deb9a138279e,,,,,0,b0a27fbb34b4362ef192deb560612fabf046cd32,405e092d5916e70df10f82d15e9c052aa9ee8d80,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/60,,, 337847573,MDExOlB1bGxSZXF1ZXN0MzM3ODQ3NTcz,64,closed,0,test_insert_upsert_all_empty_list,9599,simonw,,2019-11-07T04:24:45Z,2019-11-07T04:32:38Z,2019-11-07T04:32:38Z,2019-11-07T04:32:38Z,8dab9fd1ccf571e188eec9ccf606a0c50fccf200,,,,,0,8daea7f1265ddcce67d28258068a25666954000f,a0a65f9a6405079b01aefdbf4b5f507bc758567a,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/64,,, 337853394,MDExOlB1bGxSZXF1ZXN0MzM3ODUzMzk0,65,closed,0,Release 1.12.1,9599,simonw,,2019-11-07T04:51:29Z,2019-11-07T04:58:48Z,2019-11-07T04:58:47Z,2019-11-07T04:58:47Z,0a0cec3cf27861455e8cd1c4d84937825a18bb30,,,,,0,28f8a238ab8fc2a70ee81bd73de6c167d9db9cdf,8dab9fd1ccf571e188eec9ccf606a0c50fccf200,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/65,,, 346264926,MDExOlB1bGxSZXF1ZXN0MzQ2MjY0OTI2,67,closed,0,Run tests against 3.5 too,9599,simonw,,2019-11-27T14:20:35Z,2019-12-31T01:29:44Z,2019-12-31T01:29:43Z,,88375b0bc055067b996584f06ed85a9a90c5aa1a,,,,,0,4c6e5a4486e0e17555774eb3279142234a8b4abc,0a0cec3cf27861455e8cd1c4d84937825a18bb30,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/67,,, 357992588,MDExOlB1bGxSZXF1ZXN0MzU3OTkyNTg4,72,closed,0,Fixed implementation of upsert,9599,simonw,Refs #66,2019-12-30T05:08:05Z,2019-12-30T05:29:24Z,2019-12-30T05:29:24Z,2019-12-30T05:29:24Z,9f47e8b9a4cb788b48b76aee1333c6f3baaebbd6,,,,,0,ab8a4bda75fc59871ba8445c6a0fb2332483029c,dc0a62556ec092be7b341c5220e0410354f7cd02,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/72,,, 359822773,MDExOlB1bGxSZXF1ZXN0MzU5ODIyNzcz,75,closed,0,Explicitly include tests and docs in sdist,15092,jayvdb,Also exclude 'tests' from runtime installation.,2020-01-07T04:53:20Z,2020-01-31T00:21:27Z,2020-01-31T00:21:27Z,2020-01-31T00:21:27Z,0988f2eccc2dfa26b1a55243582222f540a72838,,,,,0,39a836450b23bf2fe1ba9a071a5a9a00a0949cd6,59a2e8ebdcbde7e6fb091b0556713ca5a20ea4e7,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/75,,, 369348084,MDExOlB1bGxSZXF1ZXN0MzY5MzQ4MDg0,78,closed,0,"New conversions= feature, refs #77",9599,simonw,,2020-01-31T00:02:33Z,2020-09-22T07:48:29Z,2020-01-31T00:24:31Z,2020-01-31T00:24:31Z,e8b2b7383bd94659d3b7a857a1414328bc48bc19,,,,,0,58190d67821aaa57c8ca0320a08e3691d6e27344,59a2e8ebdcbde7e6fb091b0556713ca5a20ea4e7,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/78,,, 369394043,MDExOlB1bGxSZXF1ZXN0MzY5Mzk0MDQz,80,closed,0,on_create mechanism for after table creation,9599,simonw,"I need this for `geojson-to-sqlite`, in particular https://github.com/simonw/geojson-to-sqlite/issues/6",2020-01-31T03:38:48Z,2020-01-31T05:08:04Z,2020-01-31T05:08:04Z,,e6dc95d19348e72b28b42e73a18737cb2e4563e0,,,,,0,45bf0c25492c276bde0b85868ffb55f169375bd7,f7289174e66ae4d91d57de94bbd9d09fabf7aff4,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/80,,, 395258687,MDExOlB1bGxSZXF1ZXN0Mzk1MjU4Njg3,96,closed,0,Add type conversion for Panda's Timestamp,32605365,b0b5h4rp13,"Add type conversion for Panda's Timestamp, if Panda library is present in system (thanks for this project, I was about to do the same thing from scratch)",2020-03-29T14:13:09Z,2020-03-31T04:40:49Z,2020-03-31T04:40:48Z,2020-03-31T04:40:48Z,8ea626e5fcdc4c9e52f615c6347e68173805f8b4,,,,,0,16ebbd2d494caabd0eeb502f8a944614b464bb12,22250a9c735077d6f365b73bf824e6c67b122c83,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/96,,, 445023326,MDExOlB1bGxSZXF1ZXN0NDQ1MDIzMzI2,118,closed,0,Add insert --truncate option,79913,tsibley," Deletes all rows in the table (if it exists) before inserting new rows. SQLite doesn't implement a TRUNCATE TABLE statement but does optimize an unqualified DELETE FROM. This can be handy if you want to refresh the entire contents of a table but a) don't have a PK (so can't use --replace), b) don't want the table to disappear (even briefly) for other connections, and c) have to handle records that used to exist being deleted. Ideally the replacement of rows would appear instantaneous to other connections by putting the DELETE + INSERT in a transaction, but this is very difficult without breaking other code as the current transaction handling is inconsistent and non-systematic. There exists the possibility for the DELETE to succeed but the INSERT to fail, leaving an empty table. This is not much worse, however, than the current possibility of one chunked INSERT succeeding and being committed while the next chunked INSERT fails, leaving a partially complete operation.",2020-07-06T21:58:40Z,2020-07-08T17:26:21Z,2020-07-08T17:26:21Z,2020-07-08T17:26:21Z,ae4593316ccf5e42ad26f27033193834a7e696c8,,,,,0,332f7d770b84734dbed4842ab3ed24ee5b687889,f8277d0fb9c05a88a9ff01d996e31d55f0f0a645,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/118,,, 445833908,MDExOlB1bGxSZXF1ZXN0NDQ1ODMzOTA4,120,closed,0,Fix query command's support for DML,79913,tsibley,See commit messages for details. I ran into this while investigating another feature/issue.,2020-07-08T01:36:34Z,2020-07-08T05:14:04Z,2020-07-08T05:14:04Z,2020-07-08T05:14:04Z,f8277d0fb9c05a88a9ff01d996e31d55f0f0a645,,,,,0,6a660d12a27864d6ab552e11eef9fd13bc281198,d0cdaaaf00249230e847be3a3b393ee2689fbfe4,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/120,,, 475665984,MDExOlB1bGxSZXF1ZXN0NDc1NjY1OTg0,142,closed,0,"insert_all(..., alter=True) should work for new columns introduced after the first 100 records",96218,simonwiles,Closes #139.,2020-08-28T22:22:57Z,2020-08-30T07:28:23Z,2020-08-28T22:30:14Z,2020-08-28T22:30:14Z,947bb7626fd1763608a470adf9cf5f156ef003e9,,,,,0,1b992c7c1e5855caa87c7939efad287052f446f3,ea87c2b943fdd162c42a900ac0aea5ecc2f4b9d9,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/142,,, 475874493,MDExOlB1bGxSZXF1ZXN0NDc1ODc0NDkz,146,closed,0,Handle case where subsequent records (after first batch) include extra columns,96218,simonwiles,"Addresses #145. I 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.",2020-08-30T07:13:58Z,2020-09-08T23:20:37Z,2020-09-08T23:20:37Z,2020-09-08T23:20:36Z,e6d202b742a7b531fffa593703d34f8337632d68,,,,,0,40fcea41525682fdc2f601da787b29d5a8517dcd,deb2eb013ff85bbc828ebc244a9654f0d9c3139e,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/146,,, 481616704,MDExOlB1bGxSZXF1ZXN0NDgxNjE2NzA0,151,closed,0,Tracer mechanism for seeing underlying SQL,9599,simonw,"Refs #150. Needs tests and documentation, including for the new `db.execute()` and `db.executescript()` methods.",2020-09-07T19:46:43Z,2020-09-07T21:57:00Z,2020-09-07T21:57:00Z,2020-09-07T21:57:00Z,cf2cb244faf992118f34aa196387a4ef8b39a20f,,,,,0,dc82bf371911d01ac140f40ea99d06d2daee507e,3e87500e1561f5c4e105cd026d33e0f715cc7dea,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/151,,, 483027587,MDExOlB1bGxSZXF1ZXN0NDgzMDI3NTg3,156,closed,0,Typos in tests,96218,simonwiles,"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.",2020-09-09T18:00:58Z,2020-09-09T18:24:50Z,2020-09-09T18:21:23Z,2020-09-09T18:21:23Z,367082e787101fb90901ef3214804ab23a92ce46,,,,,0,b777776753ef08f35dfaa7d86b2d5082e8904f27,6be61263642d8e46ec54cf5f51af74e0df2f2393,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/156,,, 483175509,MDExOlB1bGxSZXF1ZXN0NDgzMTc1NTA5,158,closed,0,Fix accidental mega long line in docs,167319,tomviner,,2020-09-09T22:31:23Z,2020-09-16T06:21:43Z,2020-09-16T06:21:43Z,2020-09-16T06:21:43Z,7805d53bcf11199bd1f2b07e05ae90151f9d0eb0,,,,,0,5c1d8a5f3ac8684657eefe4f57ff5ff605f6b633,367082e787101fb90901ef3214804ab23a92ce46,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/158,,, 490607949,MDExOlB1bGxSZXF1ZXN0NDkwNjA3OTQ5,161,closed,0,table.transform() method,9599,simonw,"Refs #114 - [x] Ability to change the primary key - [x] Support for changing default value for columns - [x] Support for changing `NOT NULL` status of columns - [x] Support for copying existing foreign keys and removing them - Support for `conversions=` parameter - [x] Detailed documentation - [x] `PRAGMA foreign_keys` stuff",2020-09-21T23:16:59Z,2020-09-22T07:48:24Z,2020-09-22T04:20:02Z,2020-09-22T04:20:02Z,987dd123f2ac43c5ab66d69e59d454fe09660606,,,5897911,2.20,0,dc3eb9c313502832c07f4de889aa60c373f45b52,ef882986d07f157b6bcc6be3d7b64270fda3e523,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/161,,, 490703173,MDExOlB1bGxSZXF1ZXN0NDkwNzAzMTcz,166,closed,0,Keyword only arguments for transform(),9599,simonw,Refs #165,2020-09-22T05:41:44Z,2020-09-22T06:39:11Z,2020-09-22T06:39:11Z,2020-09-22T06:39:10Z,f8e10df00eae209fb0a1ea03384d9153f673a3ec,,,,,0,f8648cac3a6dda90578a1536cdae44d145633a2c,987dd123f2ac43c5ab66d69e59d454fe09660606,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/166,,, 492257405,MDExOlB1bGxSZXF1ZXN0NDkyMjU3NDA1,174,closed,0,"Much, much faster extract() implementation",9599,simonw,Takes my test down from ten minutes to four seconds. Refs #172.,2020-09-24T07:52:31Z,2020-09-24T15:44:00Z,2020-09-24T15:43:56Z,2020-09-24T15:43:56Z,022cdd97a9ddab1a152e23e1e1c42e78c1ed0fa9,,,,,0,227095ee90e2a92effec6478d3e629a24d3ccfba,0ca5585fcb834122193e8e7186f926217b23cb8a,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/174,,, 493162767,MDExOlB1bGxSZXF1ZXN0NDkzMTYyNzY3,178,closed,0,Update README.md,19921,shakeel,"The `sqlite-utils insert releases.db releases - --pk` is missing the pk field name, added ` ""id""` to fix it.",2020-09-25T15:52:11Z,2020-10-01T14:18:30Z,2020-09-30T20:29:28Z,2020-09-30T20:29:28Z,cada1017edcfa691c2314d7ad1b7c7576495317f,,,,,0,0c6a81dae802a55d5469c18cd32402d11b6e8a59,94fc62857ee2655a21d85f6dae84b67bbfa5956d,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/178,,, 499603359,MDExOlB1bGxSZXF1ZXN0NDk5NjAzMzU5,184,closed,0,Test against Python 3.9,9599,simonw,,2020-10-08T01:37:05Z,2020-10-08T01:44:06Z,2020-10-08T01:44:06Z,2020-10-08T01:44:06Z,8e91de8e4edf6c8abeeccdf084b8870fff40a51a,,,,,0,975c05b6dde9feebcdecabc047d47122ebcfdf84,7f4fe9190c1df7f0e72f9d7040327a43cf252c48,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/184,,, 510235909,MDExOlB1bGxSZXF1ZXN0NTEwMjM1OTA5,189,closed,0,Allow iterables other than Lists in m2m records,35681,adamwolf,"I was playing around with sqlite-utils, creating a Roam Research dogsheep-style importer for Datasette, and ran into a slight snag. I wanted to use a generator to add an order column in an importer. It looked something like: ``` def order_generator(iterable, attr=None): if attr is None: attr = ""order"" order: int = 0 for i in iterable: i[attr] = order order += 1 yield i ``` When 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. (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.) The automated tests still pass, but I did not add any new ones. Let me know what you think! I'm really loving Datasette and its ecosystem; thanks for everything!",2020-10-26T18:47:44Z,2020-10-27T16:28:37Z,2020-10-27T16:24:21Z,2020-10-27T16:24:21Z,f045d8559a6d2cb922a2de30fbcc896a4486b82f,,,,,0,93230b2acb61635b6d5070ad9c65e7221c63b75a,e4f1c7b936981de29823730c5dbef4f4ba7a4286,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/189,,, 510956134,MDExOlB1bGxSZXF1ZXN0NTEwOTU2MTM0,190,closed,0,Progress bar for sqlite-utils insert command,9599,simonw,Refs #173,2020-10-27T18:08:53Z,2020-10-27T18:16:03Z,2020-10-27T18:16:03Z,2020-10-27T18:16:03Z,f99a23652910b03ac4669bbbb35a9b484451aabb,,,,,0,62d678122a251812cd650845705ca7b9efcef86d,c7e5dd64513c0ec2b2df4c51c8df924c282417f9,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/190,,, 515014883,MDExOlB1bGxSZXF1ZXN0NTE1MDE0ODgz,195,closed,0,table.search() improvements plus sqlite-utils search command,9599,simonw,Refs #192. Still needs tests.,2020-11-03T22:02:08Z,2020-11-06T18:30:49Z,2020-11-06T18:30:42Z,2020-11-06T18:30:42Z,d411fba1f4124047429ac9d1175a04b36bf5bee9,,,,,0,973d94d44f27d35d856fe1cc822f9d5d40e4b5e6,59d8689ed0e6e042d99fd650896def680ca3c657,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/195,,, 521287994,MDExOlB1bGxSZXF1ZXN0NTIxMjg3OTk0,203,open,0,changes to allow for compound foreign keys,1049910,drkane,"Add support for compound foreign keys, as per issue #117 Not sure if this is the right approach. In particular I'm unsure about: - 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. - 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. - I haven't added any ability to the CLI to add compound foreign keys, it's only in the python API at the moment. The PR also contains a minor related change that columns and tables are always quoted in foreign key definitions.",2020-11-16T00:30:10Z,2023-01-25T18:47:18Z,,,0507a9464314f84e9e58b1931c583df51d757d7c,,,,,0,5e43e31c2b9bcf6b5d1460b0f848fed019ed42a6,f1277f638f3a54a821db6e03cb980adad2f2fa35,FIRST_TIME_CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/203,,, 529090560,MDExOlB1bGxSZXF1ZXN0NTI5MDkwNTYw,204,closed,0,use jsonify_if_need for sql updates,78035,mfa,,2020-11-29T10:49:00Z,2020-12-08T17:49:42Z,2020-12-08T17:49:42Z,2020-12-08T17:49:42Z,c5f4f0f70ce394dfec6054c3c5aaedf330887093,,,,,0,8ea9ad1913aa63395391818ebb4e43bfce936dda,60d3c4821be4cf25c41097c1e8b79b2e60c5ead5,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/204,,, 537791675,MDExOlB1bGxSZXF1ZXN0NTM3NzkxNjc1,208,closed,0,sqlite-utils analyze-tables command and table.analyze_column() method,9599,simonw,"Refs #207 - [x] Improve design of CLI output - [x] Truncate long values in least/most common - [x] Add a `-c` column selection option - [x] Tests - [x] Documentation",2020-12-12T05:27:49Z,2020-12-13T07:20:16Z,2020-12-13T07:20:12Z,2020-12-13T07:20:12Z,69a121e08847acbf95abf0c2df1759fc73dc81b8,,,,,0,95a966bb6216215d40d0016d673a28b04428db43,c5f4f0f70ce394dfec6054c3c5aaedf330887093,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/208,,, 560204306,MDExOlB1bGxSZXF1ZXN0NTYwMjA0MzA2,224,closed,0,Add fts offset docs.,37962604,polyrand,"The limit can be passed as a string to the query builder to have an offset. I have tested it using the shorthand `limit=f""15, 30""`, the standard syntax should work too.",2021-01-22T20:50:58Z,2021-02-14T19:31:06Z,2021-02-14T19:31:06Z,,4d6ff040770119fb2c1bcbc97678d9deca752f2f,,,,,0,341f50d2d95ba1d69ad64ba8c0ec0ffa9a68d063,36dc7e3909a44878681c266b90f9be76ac749f2d,NONE,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/224,,, 564215011,MDExOlB1bGxSZXF1ZXN0NTY0MjE1MDEx,225,closed,0,fix for problem in Table.insert_all on search for columns per chunk of rows,261237,nieuwenhoven,"Hi, I 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`. The 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. I'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. Thanks, kind regards, Frans ``` # this is a (condensed) chunk of data from my Apple healthkit export that caused the problem. # the 3 last items in the chunk have additional keys: metadata_HKMetadataKeySyncVersion and metadata_HKMetadataKeySyncIdentifier chunk = [{'sourceName': 'AppleÂ\xa0Watch van Frans', 'sourceVersion': '7.0.1', 'device': '<, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch3,4, software:7.0.1>', 'unit': 'km', 'creationDate': '2020-10-10 12:29:09 +0100', 'startDate': '2020-10-10 12:29:06 +0100', 'endDate': '2020-10-10 12:29:07 +0100', 'value': '0.00518016'}, {'sourceName': 'AppleÂ\xa0Watch van Frans', 'sourceVersion': '7.0.1', 'device': '<, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch3,4, software:7.0.1>', 'unit': 'km', 'creationDate': '2020-10-10 12:29:10 +0100', 'startDate': '2020-10-10 12:29:07 +0100', 'endDate': '2020-10-10 12:29:08 +0100', 'value': '0.00544049'}, {'sourceName': 'AppleÂ\xa0Watch van Frans', 'sourceVersion': '6.2.6', 'device': '<, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch3,4, software:6.2.6>', 'unit': 'km', 'creationDate': '2020-10-14 05:54:12 +0100', 'startDate': '2020-07-15 16:40:50 +0100', 'endDate': '2020-07-15 16:42:49 +0100', 'value': '0.952092', 'metadata_HKMetadataKeySyncVersion': '1', 'metadata_HKMetadataKeySyncIdentifier': '3:674DBCDB-3FE8-40D1-9FC1-E54A2B413805:616520450.99823:616520569.99360:119'}, {'sourceName': 'AppleÂ\xa0Watch van Frans', 'sourceVersion': '6.2.6', 'device': '<, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch3,4, software:6.2.6>', 'unit': 'km', 'creationDate': '2020-10-14 05:54:12 +0100', 'startDate': '2020-07-15 16:42:49 +0100', 'endDate': '2020-07-15 16:44:51 +0100', 'value': '0.848983', 'metadata_HKMetadataKeySyncVersion': '1', 'metadata_HKMetadataKeySyncIdentifier': '3:674DBCDB-3FE8-40D1-9FC1-E54A2B413805:616520569.99360:616520691.98826:119'}, {'sourceName': 'AppleÂ\xa0Watch van Frans', 'sourceVersion': '6.2.6', 'device': '<, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch3,4, software:6.2.6>', 'unit': 'km', 'creationDate': '2020-10-14 05:54:12 +0100', 'startDate': '2020-07-15 16:44:51 +0100', 'endDate': '2020-07-15 16:46:50 +0100', 'value': '0.834403', 'metadata_HKMetadataKeySyncVersion': '1', 'metadata_HKMetadataKeySyncIdentifier': '3:674DBCDB-3FE8-40D1-9FC1-E54A2B413805:616520691.98826:616520810.98305:119'}] def all_columns_old(): all_columns = [col for col in chunk[0]] all_columns += [column for record in chunk for column in record if column not in all_columns] return all_columns def all_columns_new(): all_columns = [col for col in chunk[0]] for record in chunk: all_columns += [column for column in record if column not in all_columns] return all_columns if __name__ == '__main__': from pprint import pprint print('problem: ') pprint(all_columns_old()) print('\nfix: ') pprint(all_columns_new()) ``` ",2021-01-29T20:16:07Z,2021-02-14T21:04:13Z,2021-02-14T21:04:13Z,,1cba965a1ddc2bd77db3bc3912aa7e8467e2fa2f,,,,,0,929ea7551135df0cc2ac9d67f4fbbecf701a11f6,36dc7e3909a44878681c266b90f9be76ac749f2d,NONE,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/225,,, 573147168,MDExOlB1bGxSZXF1ZXN0NTczMTQ3MTY4,233,closed,0,"Run tests against Ubuntu, macOS and Windows",9599,simonw,Refs #232,2021-02-14T20:11:02Z,2021-02-14T20:39:54Z,2021-02-14T20:39:54Z,2021-02-14T20:39:54Z,f51a1f6c3cb2929bcf79cb4efe3b2a9886d9c25c,,,,,0,deb01a8913441e7fedb53c52a3a9fdff274ddbd2,320f3ac33a83b32f89559ef0c162b7eca428a278,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/233,,, 580235427,MDExOlB1bGxSZXF1ZXN0NTgwMjM1NDI3,241,open,0,Extract expand - work in progress,9599,simonw,Refs #239. Still needs documentation and CLI implementation.,2021-02-25T16:36:38Z,2021-02-25T16:36:38Z,,,0bb6c7a38994627a64e7b3375931528e96b8c222,,,,,1,8d641ab08ac449081e96f3e25bd6c0226870948a,38e688fb8bcb58ae888b676fe3f7dd0529b4eecc,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/241,,, 583407989,MDExOlB1bGxSZXF1ZXN0NTgzNDA3OTg5,244,closed,0,Typo in upsert example,387669,j-e-d,Remove extra `[`,2021-03-02T23:14:14Z,2021-05-19T02:58:21Z,2021-05-19T02:58:21Z,2021-05-19T02:58:21Z,328211eaca1247cd6b33a2c0a54642f87866d85b,,,,,0,1899200fa5a43f638573ea2c483df62819ba53b1,09c3386f55f766b135b6a1c00295646c4ae29bec,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/244,,, 592289324,MDExOlB1bGxSZXF1ZXN0NTkyMjg5MzI0,245,closed,0,Correct some typos,1076745,dbready,Noticed a typo in the docs and followed that up with a spellcheck. Had to bite my tongue at some of the British spellings.,2021-03-13T04:26:56Z,2021-05-19T02:58:04Z,2021-05-19T02:58:04Z,2021-05-19T02:58:04Z,3e62ab62a88992d4bbb0fe83debec3bacd93ebf3,,,,,0,79de6b639f9d14818a5006af4f63e4e20c961a10,22f1d9e1999f70af4c5b0f880a820cd9eead3942,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/245,,, 593805804,MDExOlB1bGxSZXF1ZXN0NTkzODA1ODA0,247,closed,0,FTS quote functionality from datasette,16001974,DeNeutoy,"Addresses #246 - this is a bit of a kludge because it doesn't actually *validate* the FTS string, just makes sure that it will not crash when executed, but I figured that building a query parser is a bit out of the scope of sqlite-utils and if you actually want to use the query language, you probably need to parse that yourself. ",2021-03-16T11:17:34Z,2021-08-18T18:43:12Z,2021-08-18T18:43:12Z,2021-08-18T18:43:11Z,53fec0d8639d2a66e322d05e1fcc8f34caa57815,,,,,0,af989af658e23be0077f226292594226103b063d,1fe73c898b44695052f1a9ca832818d50cecf662,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/247,,, 614727036,MDExOlB1bGxSZXF1ZXN0NjE0NzI3MDM2,254,closed,0,Fix incorrect create-table cli description,1935268,robjwells,The description for `create-table` was duplicated from `create-index`.,2021-04-13T20:03:15Z,2021-05-19T04:43:46Z,2021-05-19T02:57:26Z,2021-05-19T02:57:26Z,e7b2626291040b78b9a2dbc2982ba72691fb1a0f,,,,,0,cdeb7d7da77c6d1cd3554d08cb5659243cb3d55b,22f1d9e1999f70af4c5b0f880a820cd9eead3942,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/254,,, 623755723,MDExOlB1bGxSZXF1ZXN0NjIzNzU1NzIz,258,closed,0,Fixing insert from JSON containing strings with non-ascii characters …,6586811,dylan-wu,"…are escaped aps unicode for lists, tuples, dicts Fix of #257 ",2021-04-26T20:50:00Z,2021-05-19T02:47:44Z,2021-05-19T02:47:44Z,2021-05-19T02:47:44Z,6f4f9a3effeb16de0348d3cf136664f7531f498d,,,,,0,27e7c1ae1913e2127361af4fc664c2061fb76627,22f1d9e1999f70af4c5b0f880a820cd9eead3942,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/258,,, 657373726,MDExOlB1bGxSZXF1ZXN0NjU3MzczNzI2,262,closed,0,Ability to add descending order indexes,9599,simonw,Refs #260,2021-05-29T04:51:04Z,2021-05-29T05:01:42Z,2021-05-29T05:01:39Z,2021-05-29T05:01:39Z,51d01da30d45c1fbc1e587e6046a933529cf915e,,,,,0,50a4fb722d29c3e53f7b148a41aeda901d02a264,b2302875c97f723e02cc39136d0b20fd706369aa,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/262,,, 671014751,MDExOlB1bGxSZXF1ZXN0NjcxMDE0NzUx,273,closed,0,sqlite-utils memory command for directly querying CSV/JSON data,9599,simonw,"Refs #272. Initial implementation only does CSV data, still needs: - [x] Implement `--save` - [x] Add `--dump` to the documentation - [x] Add `--attach` example to the documentation - [x] Replace `:memory:` in documentation",2021-06-16T05:04:58Z,2021-06-18T15:01:17Z,2021-06-18T15:00:52Z,2021-06-18T15:00:52Z,42ec59d8ee3fcfb8ac1affb772aed43b6e2a7381,,,,,0,df7a37bdb730bb863fa29758f6fb35f809fa0dd0,78aebb6479420217454747870737bc593a259abc,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/273,,, 672359609,MDExOlB1bGxSZXF1ZXN0NjcyMzU5NjA5,277,closed,0,add -h support closes #276,601708,mcint,This appears to be the [canonical solution](https://click.palletsprojects.com/en/7.x/documentation/#help-parameter-customization).,2021-06-17T08:08:26Z,2021-06-18T14:56:59Z,2021-06-18T14:56:59Z,2021-06-18T14:56:59Z,aa652b6afe43d2b40fabc7a513c3e68866e030a5,,,,,0,abbd324a2178f09b19966ec36ab2f584d1824c59,a19ce1a4d0048d389411cfe11a5dbe4c503720e1,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/277,,, 677554929,MDExOlB1bGxSZXF1ZXN0Njc3NTU0OTI5,293,closed,0,Test against Python 3.10-dev,9599,simonw,,2021-06-25T01:40:39Z,2021-10-13T21:49:33Z,2021-10-13T21:49:33Z,,0f64d20b044ecb86d9e4e5843f9590006d2f39c2,,,,,0,ae0f46a78958c0118e98c2ab18bd1b57a0478326,747be6057d09a4e5d9d726e29d5cf99b10c59dea,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/293,,, 700944644,MDExOlB1bGxSZXF1ZXN0NzAwOTQ0NjQ0,303,closed,0,sqlite-utils convert command and db[table].convert(...) method,9599,simonw,"Refs #251, #302. - [x] Get recipes working - [x] Document recipes - [x] Implement `db[table].convert(...)` method - [x] Add tests for recipes that use the new Python method - [x] Implement `db[table].convert(..., multi=True)` mechanism - [x] Documentation for `db[table].convert(...)` - [x] Refactor `sqlite-utils convert` to use the new method",2021-08-01T16:52:42Z,2021-08-02T04:47:42Z,2021-08-02T04:47:39Z,2021-08-02T04:47:39Z,5ec6686153e29ae10d4921a1ad4c841f192f20e2,,,,,0,4c3bf9730542f1e49cbf11a61dbdb7fd621453df,c7e8d72be9fe8fe0811f685a18eebc637662d41b,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/303,,, 707490789,MDExOlB1bGxSZXF1ZXN0NzA3NDkwNzg5,312,closed,0,Add reference page to documentation using Sphinx autodoc,9599,simonw,Refs #311.,2021-08-10T16:59:17Z,2021-08-10T23:09:32Z,2021-08-10T23:09:28Z,2021-08-10T23:09:28Z,6155da72c8939b5d9bdacb7853e5e8d1767ce1d5,,,,,0,43bc06481783c3cfcee70c0cb541a686e8894adb,ee469e3122d6f5973ec2584c1580d930daca2e7c,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/312,,, 719109709,MDExOlB1bGxSZXF1ZXN0NzE5MTA5NzA5,321,closed,0,"Ability to insert file contents as text, in addition to blob",9599,simonw,Refs #319.,2021-08-24T22:37:18Z,2021-08-24T23:31:17Z,2021-08-24T23:31:13Z,2021-08-24T23:31:13Z,49a010c93d90bc68ce1c6fff7639927248912b54,,,,,0,db2dd6d9f30b347f4ed22b07f59b5a615184fbfd,9258f4bd8450c951900de998a7bf81ca9b45a014,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/321,,, 719998225,MDExOlB1bGxSZXF1ZXN0NzE5OTk4MjI1,322,closed,0,Add dict type to be mapped as TEXT in sqllite,2496189,minaeid90,"the library deal with Postgres type jsonb as dictionary, add dict type as a TEXT for mapping to sqlite ",2021-08-25T20:54:26Z,2021-11-15T00:27:40Z,2021-11-15T00:27:40Z,2021-11-15T00:27:40Z,271b894af52eb6437ae6cd84eba9867ad8dd43f6,,,,,0,69619f68c26478fdee479110e084fd22711013a3,77c240df56068341561e95e4a412cbfa24dc5bc7,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/322,,, 727012996,MDExOlB1bGxSZXF1ZXN0NzI3MDEyOTk2,324,closed,0,Use python-dateutil package instead of dateutils,191622,meatcar,"While working on updating `sqlite-utils` for NixOS/Nixpkgs, I came a cross the following: In 5ec6686153e29ae10d4921a1ad4c841f192f20e2, a new dependency was added on `dateutils` (https://pypi.org/project/dateutils/). I believe this is unintentional, and instead `python-dateutil` (https://pypi.org/project/python-dateutil/) was intended. My reasoning is: - `python-dateutil` is imported here in [recipes.py](https://github.com/simonw/sqlite-utils/blob/5ec6686153e29ae10d4921a1ad4c841f192f20e2/sqlite_utils/recipes.py#L1) - The `mypy` `type-python-dateutil` dependency in [setup.py](https://github.com/simonw/sqlite-utils/blob/5ec6686153e29ae10d4921a1ad4c841f192f20e2/setup.py#L36) - `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) Seems like the trailing ""s"" seems to be the source of confusion 😅 I've swapped the dependencies out, hope this helps.",2021-09-03T18:31:19Z,2021-11-14T23:25:40Z,2021-11-14T23:25:40Z,2021-11-14T23:25:40Z,bc4c42d68879c710c851dba3c98deda96ca6caa8,,,,,0,275ac3b282947fa5df5d18de835d5d958a778e72,77c240df56068341561e95e4a412cbfa24dc5bc7,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/324,,, 729731441,MDExOlB1bGxSZXF1ZXN0NzI5NzMxNDQx,326,closed,0,Test against 3.10-dev,9599,simonw,"This tests against the latest 3.10 RC, https://www.python.org/downloads/release/python-3100rc2/",2021-09-08T15:01:15Z,2021-10-13T21:49:28Z,2021-10-13T21:49:28Z,,c563260408e1b802cbbc81ec7c1e398350a1ca3a,,,,,0,078a08765d8aefa5ce376a03b2643d4ebe1aa57e,77c240df56068341561e95e4a412cbfa24dc5bc7,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/326,,, 737050557,PR_kwDOCGYnMM4r7n-9,327,closed,0,Extract expand: Support JSON Arrays,101753,phaer,"Hi, I 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: > 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. They 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? What do you think about this approach? I could try to add it to the cli interface and documentation if wanted. Thanks for this awesome piece of software in any case! :sun_with_face: ",2021-09-19T10:34:30Z,2022-12-29T09:05:36Z,2022-12-29T09:05:36Z,,f0105cde23452cb4c8a15fc6096154b15d9b7c5a,,,,,0,2840c697aa9817462d864ed5f8a7696d749fe039,8d641ab08ac449081e96f3e25bd6c0226870948a,NONE,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/327,,, 757797315,PR_kwDOCGYnMM4tKxHD,330,closed,0,Test against Python 3.10,9599,simonw,,2021-10-13T21:50:22Z,2021-11-15T02:59:29Z,2021-10-13T22:25:05Z,2021-10-13T22:25:05Z,fda4dad23a0494890267fbe8baf179e2b56ee914,,,,,0,fc3de90963b6b097826d36f6a24c46267659dcf2,718a8f61bcaed39c04d5d223104056213f8c8516,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/330,,, 768796296,PR_kwDOCGYnMM4t0uaI,333,closed,0,Add functionality to read Parquet files.,2118708,Florents-Tselai,"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 ). The current implementation works (data is read & data types are inferred correctly. I'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.",2021-10-28T23:43:19Z,2021-11-25T19:47:35Z,2021-11-25T19:47:35Z,,eda2b1f8d2670c6ca8512e3e7c0150866bd0bdc6,,,,,0,50ec2e49dee3b09a48a7aef55eceaa3f752a52e7,fda4dad23a0494890267fbe8baf179e2b56ee914,NONE,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/333,,, 774610166,PR_kwDOCGYnMM4uK5z2,337,closed,0,Default values for `--attach` and `--param` options,771193,urbas,"It seems that `click` 8.x uses `None` as the default value for `multiple=True` options. This change makes the code forward-compatible with `click` 8.x. See this build failure for more info: https://hydra.nixos.org/build/156926608",2021-11-05T21:57:53Z,2021-11-05T22:33:03Z,2021-11-05T22:33:02Z,,eb8bf28da1794638a5693043cd5268f506a674d3,,,,,0,095fc64c5399d75d44d304571a21293d06d817f0,fda4dad23a0494890267fbe8baf179e2b56ee914,NONE,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/337,,, 791153878,PR_kwDOCGYnMM4vKAzW,347,open,0,Test against pysqlite3 running SQLite 3.37,9599,simonw,Refs #346 and #344.,2021-11-29T23:17:57Z,2021-12-11T01:02:19Z,,,f70a61e58ae62e53af74ab48d742bdc335131fbd,,,,,0,1a7ef2fe2064ace01d5535fb771f941296fb642a,213a0ff177f23a35f3b235386366ff132eb879f1,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/347,,, 815164865,PR_kwDOCGYnMM4wlm3B,361,closed,0,--lines and --text and --convert and --import,9599,simonw,"Refs #356 Still TODO: - [x] Get `--lines` working, with tests - [x] Get `--text` working, with tests - [x] Get regular JSON import working with `--convert` with tests - [x] Get `--lines` working with `--convert` with tests - [x] Get `--text` working with `--convert` with tests - [x] Get `--csv` and `--tsv` import working with `--convert` with tests - [x] Get `--nl` working with `--convert` with tests - [x] Documentation for all of the above",2022-01-06T01:49:44Z,2022-01-06T06:37:03Z,2022-01-06T06:24:54Z,2022-01-06T06:24:54Z,413f8ed754e38d7b190de888c85fe8438336cb11,,,,,0,b7f0b88d49032a053f0de2dbba356ee1f3b949c0,f3fd8613113d21d44238a6ec54b375f5aa72c4e0,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/361,,, 816927546,PR_kwDOCGYnMM4wsVM6,367,closed,0,Initial prototype of .analyze() methods,9599,simonw,Refs #366,2022-01-08T21:35:12Z,2022-01-10T19:31:08Z,2022-01-10T19:31:08Z,,2ffcbed6787523649dd676985f3ea70a62944764,,,7558727,3.21,1,9848eaa61b43de0ddb74ff6d085bcb18f4640f91,a8f9cc6f64f299830834428509940d448b82b4ed,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/367,,, 817257851,PR_kwDOCGYnMM4wtl17,377,closed,0,`sqlite-utils bulk` command,9599,simonw,"Refs #375 Still needs: - [x] Refactor `@insert_upsert_options` so that it doesn't duplicate `@import_options` - [x] Tests - [x] Documentation - [x] Try it against a really big file",2022-01-10T05:34:24Z,2022-01-11T02:10:57Z,2022-01-11T02:10:54Z,2022-01-11T02:10:54Z,129141572f249ea290e2a075437e2ebaad215859,,,7558727,3.21,0,f4ea0d32c0543373eefaa9b9f3911eb07549eecb,b6dad08a8389736b7e960cfe9bc719cfc21a98f5,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/377,,, 821992886,PR_kwDOCGYnMM4w_p22,385,closed,0,Add new spatialite helper methods,25778,eyeseast,"Refs #79 This PR adds three new Spatialite-related methods to Database and Table: - `Database.init_spatialite` loads the Spatialite extension and initializes it - `Table.add_geometry_column` adds a geometry column - `Table.create_spatial_index` creates a spatial index Has tests and documentation. Feedback very welcome.",2022-01-14T03:57:30Z,2022-02-05T00:04:26Z,2022-02-04T05:55:10Z,2022-02-04T05:55:10Z,ee11274fcb1c00f32c95f2ef2924d5349538eb4d,,,,,0,af86b17acf2fa50048e38b96497636d49db89766,74586d3cb26fa3cc3412721985ecdc1864c2a31d,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/385,,, 853484980,PR_kwDOCGYnMM4y3yW0,407,closed,0,Add SpatiaLite helpers to CLI,25778,eyeseast,"Closes #398 This adds SpatiaLite helpers to the CLI. ```sh # init spatialite when creating a database sqlite-utils create database.db --enable-wal --init-spatialite # add geometry columns # needs a database, table, geometry column name, type, with optional SRID and not-null # this will throw an error if the table doesn't already exist sqlite-utils add-geometry-column database.db table-name geometry --srid 4326 --not-null # spatial index an existing table/column # this will throw an error it the table and column don't exist sqlite-utils create-spatial-index database.db table-name geometry ``` Docs and tests are included. ",2022-02-15T16:50:17Z,2022-02-16T01:49:40Z,2022-02-16T00:58:08Z,2022-02-16T00:58:07Z,a692c56659c3563b26dcdc9e3534d63ecc26e180,,,,,0,a974da591915e0548182bbbf01da34ecb9e537e6,e7f040106b5f5a892ebd984f19b21c605e87c142,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/407,,, 862823026,PR_kwDOCGYnMM4zbaJy,410,closed,0,Correct spelling mistakes (found with codespell),3818,EdwardBetts,,2022-02-24T20:44:18Z,2022-03-06T08:48:29Z,2022-03-01T21:05:29Z,2022-03-01T21:05:29Z,b6c9dfce0ba27eb5fb6bc2221044798420f861c4,,,,,0,a174069da6669b8914d4a08dded7fd750d52a316,7a098aa0c5e8beef6ccc55c866cf7792af5fcf43,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/410,,, 887534558,PR_kwDOCGYnMM405rPe,419,closed,0,Ignore common generated files,25778,eyeseast,"Closes #418 This adds four files to `.gitignore`: .hypothesis/ Pipfile Pipfile.lock pyproject.toml Those are all generated in the course of development and testing.",2022-03-23T18:06:22Z,2022-03-24T21:01:44Z,2022-03-24T21:01:44Z,2022-03-24T21:01:44Z,396f80fcc60da8dd844577114f7920830a2e5403,,,,,0,228f73615cf993dd3caf3c240682c00392832bb8,93fa79d30b1531bea281d0eb6b925c4e61bc1aa6,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/419,,, 925807233,PR_kwDOCGYnMM43LrKB,429,closed,0,Depend on click-default-group-wheel,9599,simonw,"Trying to get this to work with Pyodide. Refs: https://github.com/simonw/click-default-group-wheel/issues/3",2022-05-02T18:03:10Z,2022-05-02T18:52:42Z,2022-05-02T18:05:00Z,2022-05-02T18:05:00Z,ed6fd516082e8cc83b199798f62dd67728a6974f,,,,,0,4a02dcf265702a4f11eed943bf8feaa502c590d5,e3a14c33a033b0c2fc00f2470666caaf9027e446,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/429,,, 943686022,PR_kwDOCGYnMM44P4GG,437,closed,0,docs to dogs,114388,yurivish,Fixes a typo.,2022-05-22T15:50:33Z,2022-05-30T21:32:41Z,2022-05-30T21:32:41Z,2022-05-30T21:32:41Z,9fedfc69d7239ac49900051e1c48ee9cdd470d9e,,,,,0,9e540417821385939db0fdd2d0a859f85be377e6,59be60c471fd7a2c4be7f75e8911163e618ff5ca,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/437,,, 992299943,PR_kwDOCGYnMM47JUun,452,closed,0,Add duplicate table feature,1690072,davidleejy,"This PR addresses a feature request raised in issue #449. Specifically this PR adds a functionality that lets users duplicate a table via: ```python table_new = db[""my_table""].duplicate(""new_table"") ``` Test added in file `tests/test_duplicate.py`. Happy to make changes to meet maintainers' feedback, if any. ",2022-07-09T20:24:31Z,2022-07-15T21:21:37Z,2022-07-15T21:21:36Z,2022-07-15T21:21:36Z,b366e68deb0780048a23610c279552f8529d4726,,,,,0,eef350fe543c6301c61b257c5f708e0e16ed5a34,42440d6345c242ee39778045e29143fb550bd2c2,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/452,,, 1000800283,PR_kwDOCGYnMM47pwAb,455,closed,0,"in extract code, check equality with IS instead of = for nulls",536941,fgregg,"sqlite ""IS"" is equivalent to SQL ""IS NOT DISTINCT FROM"" closes #423",2022-07-19T13:40:25Z,2022-08-27T14:45:03Z,2022-08-27T14:45:03Z,2022-08-27T14:45:03Z,c5f8a2eb1a81a18b52825cc649112f71fe419b12,,,,,0,1b35a92e3ede76f0f29f6f8dcd899f44b2abbb02,855bce8c3823718def13e0b8928c58bf857e41b2,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/455,,, 1009936222,PR_kwDOCGYnMM48Mmde,457,closed,0,Link to installation instructions,9599,simonw,Also testing https://docs.readthedocs.io/en/stable/pull-requests.html,2022-07-27T17:38:36Z,2022-08-27T03:55:52Z,2022-07-27T17:57:50Z,2022-07-27T17:57:50Z,77ca051d4f5ddbd42fd6250749efac7ea85ea094,,,8355157,3.29,0,80b3907471f724aeecae75796663815c87731e77,9e6cceac1c0e086429e2d308b700e59cc53a1991,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/457,,, 1015320511,PR_kwDOCGYnMM48hI-_,460,closed,0,Cross-link CLI to Python docs,9599,simonw,"Work in progress, partly to test the ReadTheDocs preview link action. Refs: - #426 ---- :books: Documentation preview :books:: https://readthedocs-preview--460.org.readthedocs.build/en/460/ ",2022-08-02T16:18:28Z,2022-08-18T21:58:10Z,2022-08-18T21:58:07Z,2022-08-18T21:58:07Z,f4fb78fa95057fbc86c734020835a3155695297f,,,,,0,f21f4ccf7197e7a0ac8c2eb5086659fc3eb5bc05,1856002e3c0fcc9f09f72ab7d97ad8c75f6de7df,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/460,,, 1015591301,PR_kwDOCGYnMM48iLGF,462,closed,0,Discord badge,9599,simonw,"Also testing fix for: - https://github.com/readthedocs/readthedocs-preview/issues/10 ---- :books: Documentation preview :books:: https://sqlite-utils--462.org.readthedocs.build/en/462/ ",2022-08-02T20:56:04Z,2022-08-02T21:15:57Z,2022-08-02T21:15:52Z,2022-08-02T21:15:52Z,271433fdd18e436b0a527ab899cb6f6fa67f23d0,,,,,0,0a14a031385f2647be0b9d15d96c1d44d05c2296,98a28cbfe6cea67f6334b42b74f35b0ddd309561,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/462,,, 1022525059,PR_kwDOCGYnMM488n6D,463,closed,0,Use Read the Docs action v1,244656,humitos,"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` ---- :books: Documentation preview :books:: https://sqlite-utils--463.org.readthedocs.build/en/463/ ",2022-08-10T10:31:47Z,2022-08-18T08:30:14Z,2022-08-17T23:11:16Z,2022-08-17T23:11:16Z,83e7339255e811c62e6db8498c483c44a84d0f28,,,,,0,364110b97bd1c6e0d2bc841730e5dc1a595e537d,271433fdd18e436b0a527ab899cb6f6fa67f23d0,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/463,,, 1029360106,PR_kwDOCGYnMM49Wsnq,465,closed,0,beanbag-docutils>=2.0,9599,simonw,Refs #464,2022-08-17T22:41:39Z,2022-08-17T23:38:07Z,2022-08-17T23:38:02Z,2022-08-17T23:38:02Z,f8ffac8787e299a62c99ed1ce914cd5ace84ad94,,,,,0,bb90d3326815a041512b40bf0cf53b3ace06cd67,45e24deffea042b5db7ab84cd1eb63b3ed9bb9da,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/465,,, 1029373779,PR_kwDOCGYnMM49Wv9T,466,closed,0,Use Read the Docs action v1 (#463),9599,simonw,"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`",2022-08-17T23:11:50Z,2022-08-17T23:11:54Z,2022-08-17T23:11:54Z,2022-08-17T23:11:54Z,bb90d3326815a041512b40bf0cf53b3ace06cd67,,,,,0,83e7339255e811c62e6db8498c483c44a84d0f28,72655adabc596a9eed43cc11c07177a390791068,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/466,,, 1034485141,PR_kwDOCGYnMM49qP2V,468,closed,0,"db[table].create(..., transform=True) and create-table --transform",9599,simonw,"Work in progress. Still needs documentation and tests (and to cover more cases of things that might have changed). Refs: - #467 ---- :books: Documentation preview :books:: https://sqlite-utils--468.org.readthedocs.build/en/468/ ",2022-08-23T17:27:58Z,2022-08-27T23:17:55Z,2022-08-27T23:17:55Z,2022-08-27T23:17:55Z,104f37fa4d2e7e5999c1d829267b62c737f74d3e,,,8355157,3.29,0,2f6a64f61d561df821d737719941c678dcb1a03c,c5f8a2eb1a81a18b52825cc649112f71fe419b12,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/468,,, 1038565427,PR_kwDOCGYnMM4950Az,473,closed,0,Support entrypoints for `--load-extension`,9599,simonw,"Refs #470 ---- :books: Documentation preview :books:: https://sqlite-utils--473.org.readthedocs.build/en/473/ ",2022-08-27T05:53:59Z,2022-08-27T05:55:52Z,2022-08-27T05:55:47Z,2022-08-27T05:55:47Z,19dd077944429c1365b513d80cc71c605ae3bed3,,,,,0,72db599ae03fabe2e9f999999e258edc1a99ed59,a46a5e3a9e03dcdd8c84a92e4a5dbfa02ba461fa,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/473,,, 1040691996,PR_kwDOCGYnMM4-B7Mc,480,closed,0,search_sql add include_rank option,7908073,chapmanjacobd,"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 ---- :books: Documentation preview :books:: https://sqlite-utils--480.org.readthedocs.build/en/480/ ",2022-08-30T09:10:29Z,2022-08-31T03:40:35Z,2022-08-31T03:40:35Z,2022-08-31T03:40:35Z,ecf1d40112e52a8f4e509c39b98caae996b7bc36,,,,,0,3dbfca6fdd878ba381f83157fdae2042eeaed371,087753cd42c406f1e060c1822dcd9b5fda3d60f4,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/480,,, 1050417981,PR_kwDOCGYnMM4-nBs9,486,closed,0,"progressbar for inserts/upserts of all fileformats, closes #485",99098079,MischaU8," ---- :books: Documentation preview :books:: https://sqlite-utils--486.org.readthedocs.build/en/486/ ",2022-09-08T14:58:02Z,2022-09-15T20:40:03Z,2022-09-15T20:37:51Z,2022-09-15T20:37:51Z,0b315d3fa83c1584eaeec32f24912898621e437a,,,,,0,d5db749480aaf8518e611ff55da186cadf6c63bc,d9b9e075f07a20f1137cd2e34ed5d3f1a3db4ad8,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/486,,, 1082769953,PR_kwDOCGYnMM5AicIh,498,closed,0,fix: enable-fts permanently save triggers,7908073,chapmanjacobd,"I was wondering why my all my databases were giving wild search results. Turns out create_trigger was not sticking! Running `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 ---- :books: Documentation preview :books:: https://sqlite-utils--498.org.readthedocs.build/en/498/ ",2022-10-11T05:10:51Z,2022-10-15T04:33:08Z,2022-10-11T06:34:31Z,,ab24d21e9c2aa9c514c3b65f05cfc0bafa7621c1,,,,,0,75577e595d9177177a48030a1c39573af010df51,d792dad1cf5f16525da81b1e162fb71d469995f3,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/498,,, 1083804914,PR_kwDOCGYnMM5AmYzy,499,open,0,feat: recreate fts triggers after table transform,7908073,chapmanjacobd,"https://github.com/simonw/sqlite-utils/pull/498 ---- :books: Documentation preview :books:: https://sqlite-utils--499.org.readthedocs.build/en/499/ alternatively, `self.disable_fts()`",2022-10-11T20:35:39Z,2022-10-26T17:54:51Z,,,6c71562a7a21ab93541a14453961ce3d6abca3cc,,,,,0,a25e83841f2703afb08aff4589cb559ae9060776,d792dad1cf5f16525da81b1e162fb71d469995f3,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/499,,, 1105985162,PR_kwDOCGYnMM5B6_6K,508,closed,0,Allow surrogates in parameters,7908073,chapmanjacobd,"closes #507 https://dwheeler.com/essays/fixing-unix-linux-filenames.html ---- :books: Documentation preview :books:: https://sqlite-utils--508.org.readthedocs.build/en/508/ ",2022-10-31T22:11:49Z,2022-11-17T15:11:16Z,2022-10-31T22:55:36Z,,3b551597240d9a6058b1c3c720073120db213678,,,,,0,43a8c4c91fc22fb6bea07846f144072b0d047f4e,529110e7d8c4a6b1bbf5fb61f2e29d72aa95a611,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/508,,, 1136499802,PR_kwDOCGYnMM5DvZxa,515,closed,0,"upsert new rows with constraints, fixes #514",193185,cldellow,"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. (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!) ---- :books: Documentation preview :books:: https://sqlite-utils--515.org.readthedocs.build/en/515/ ",2022-11-26T16:15:21Z,2023-05-08T21:27:11Z,2023-05-08T21:27:10Z,,c3713ef6944cbeacf36e462712cecac2176db692,,,,,0,32f8173a8fe830c224e39a0a514cd12e78de7028,965ca0d5f5bffe06cc02cd7741344d1ddddf9d56,NONE,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/515,,, 1173049178,PR_kwDOCGYnMM5F609a,519,closed,0,Fixes breaking DEFAULT values,13819005,rhoboro,"Fixes #509, Fixes #336 Thanks for the great library! I fixed a bug that `sqlite-utils transform` breaks DEFAULT values. All tests already present passed with no changes, and I added some tests for this PR. In #509 case, fixed here. ```shell $ sqlite3 test.db << EOF CREATE TABLE mytable ( col1 TEXT DEFAULT 'foo', col2 TEXT DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')) ) EOF $ sqlite3 test.db ""SELECT sql FROM sqlite_master WHERE name = 'mytable';"" CREATE TABLE mytable ( col1 TEXT DEFAULT 'foo', col2 TEXT DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')) ) $ sqlite3 test.db ""INSERT INTO mytable DEFAULT VALUES; SELECT * FROM mytable;"" foo|2022-12-21 01:15:39.669 $ sqlite-utils transform test.db mytable --rename col1 renamedcol1 $ sqlite3 test.db ""SELECT sql FROM sqlite_master WHERE name = 'mytable';"" CREATE TABLE ""mytable"" ( [renamedcol1] TEXT DEFAULT 'foo', [col2] TEXT DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')) # ← Non-String Value ) $ sqlite3 test.db ""INSERT INTO mytable DEFAULT VALUES; SELECT * FROM mytable;"" foo|2022-12-21 01:15:39.669 foo|2022-12-21 01:15:56.432 ``` And #336 case also fixed. Special values are described [here](https://www.sqlite.org/lang_createtable.html). > 3.2. The DEFAULT clause > ... A default value may also be one of the special case-independent keywords CURRENT_TIME, CURRENT_DATE or CURRENT_TIMESTAMP. ```shell $ echo 'create table bar (baz text, created_at timestamp default CURRENT_TIMESTAMP)' | sqlite3 foo.db $ sqlite3 foo.db SQLite version 3.39.5 2022-10-14 20:58:05 Enter "".help"" for usage hints. sqlite> .schema bar CREATE TABLE bar (baz text, created_at timestamp default CURRENT_TIMESTAMP); sqlite> .exit $ sqlite-utils transform foo.db bar --column-order baz $ sqlite3 foo.db SQLite version 3.39.5 2022-10-14 20:58:05 Enter "".help"" for usage hints. sqlite> .schema bar CREATE TABLE IF NOT EXISTS ""bar"" ( [baz] TEXT, [created_at] FLOAT DEFAULT CURRENT_TIMESTAMP ); sqlite> .exit $ sqlite-utils transform foo.db bar --column-order baz $ sqlite3 foo.db SQLite version 3.39.5 2022-10-14 20:58:05 Enter "".help"" for usage hints. sqlite> .schema bar CREATE TABLE IF NOT EXISTS ""bar"" ( [baz] TEXT, [created_at] FLOAT DEFAULT CURRENT_TIMESTAMP # ← Non-String Value ); ``` ---- :books: Documentation preview :books:: https://sqlite-utils--519.org.readthedocs.build/en/519/ ",2022-12-21T01:27:52Z,2023-05-08T21:13:37Z,2023-05-08T21:13:37Z,2023-05-08T21:13:37Z,6500fed8b2085869b9714ce3a08c30f61dc829ad,,,,,0,5e5c262fab69eb3c470afa57fc52d3d7d8beee7a,fc221f9b62ed8624b1d2098e564f525c84497969,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/519,,, 1234321667,PR_kwDOCGYnMM5JkkED,526,closed,0,Fix repeated calls to `Table.convert()`,167893,mcarpenter,"Fixes #525. All tests pass. There's perhaps a better way to name lambdas? There could be a collision if a caller passes a function with name like `lambda_123456`. SQLite [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). Otherwise, 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`. ---- :books: Documentation preview :books:: https://sqlite-utils--526.org.readthedocs.build/en/526/ ",2023-02-09T00:14:49Z,2023-05-08T21:56:05Z,2023-05-08T21:53:58Z,2023-05-08T21:53:58Z,02f5c4d69d7b4baebde015c56e5bc62923f33314,,,,,0,486e0cc1cd67e98c22d1f125403144cdedfa3d58,fc221f9b62ed8624b1d2098e564f525c84497969,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/526,,, 1235909998,PR_kwDOCGYnMM5Jqn1u,528,closed,0,Enable `Table.convert()` on falsey values,167893,mcarpenter,"Fixes #527 ---- :books: Documentation preview :books:: https://sqlite-utils--528.org.readthedocs.build/en/528/ ",2023-02-10T00:04:09Z,2023-05-08T21:08:23Z,2023-05-08T21:08:23Z,,279fb2c85c6b3fc7b593aaf4245bd3a038bff5f0,,,,,0,a09df3844ab91b70cebb7b888fc07cb21dffd01c,fc221f9b62ed8624b1d2098e564f525c84497969,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/528,,, 1272169404,PR_kwDOCGYnMM5L08O8,531,closed,0,Add paths for homebrew on Apple silicon,25778,eyeseast,"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)`. ---- :books: Documentation preview :books:: https://sqlite-utils--531.org.readthedocs.build/en/531/ ",2023-03-11T22:27:52Z,2023-04-09T01:49:44Z,2023-04-09T01:49:43Z,,24f3eb082b98b8d676bab2eab4f763cd9b50fe96,,,,,0,afdf6187716b19fce8692f6887a1d45c85477fee,c0251cc9271260de73b4227859a51fab9b4cb745,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/531,,, 1306498393,PR_kwDOCGYnMM5N35VZ,536,closed,0,Add paths for homebrew on Apple silicon,25778,eyeseast,"Does what it says and nothing else. This is the same set of paths as Datasette uses. ---- :books: Documentation preview :books:: https://sqlite-utils--536.org.readthedocs.build/en/536/ ",2023-04-08T13:34:21Z,2023-04-13T01:44:43Z,2023-04-13T01:44:43Z,2023-04-13T01:44:43Z,8f9a729e8aff972cb18de25b40f4113e26bbc758,,,,,0,cea05dc5eab8d10fbd8943e615d2ab0dceff863c,c0251cc9271260de73b4227859a51fab9b4cb745,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/536,,, 1311438738,PR_kwDOCGYnMM5OKveS,537,closed,0,Support self-referencing FKs in `Table.create`,544011,numist," ---- :books: Documentation preview :books:: https://sqlite-utils--537.org.readthedocs.build/en/537/ ",2023-04-12T20:26:58Z,2023-05-08T22:45:33Z,2023-05-08T21:10:01Z,2023-05-08T21:10:01Z,39ef137e6760d385dc48d03eccf9b89943636fc7,,,,,0,a75abeb61b91a28650d3b9933e7ec80ad0d92529,c0251cc9271260de73b4227859a51fab9b4cb745,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/537,,, 1358254580,PR_kwDOCGYnMM5Q9VH0,546,closed,0,"Analyze tables options: --common-limit, --no-most, --no-least",9599,simonw,"Refs #544 - [x] Documentation for CLI options - [x] Documentation for new Python API parameters: `most_common: bool` and `least_common: bool` - [x] Tests for CLI - [x] Tests for Python API",2023-05-21T15:54:39Z,2023-05-21T16:19:30Z,2023-05-21T16:19:30Z,2023-05-21T16:19:30Z,d2a7b15b2b930fe384e1f1715fc4af23386f4935,,,,,0,2eca17d46eca2cff52c78553085ec64d9029c969,e047cc32e9d5de7025d4d3c16554d4290f4bd3d1,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/546,,, 1358282799,PR_kwDOCGYnMM5Q9cAv,549,closed,0,TUI powered by Trogon,9599,simonw,"Refs: - #545 ---- :books: Documentation preview :books:: https://sqlite-utils--549.org.readthedocs.build/en/549/ ",2023-05-21T17:55:42Z,2023-05-21T18:42:00Z,2023-05-21T18:41:56Z,2023-05-21T18:41:56Z,718b0cba9b32d97a41bcf9757c97fe1d058da81c,,,,,0,948692a94b22852b3147abebac9d719b69320b57,e8c5b042e49c627aefd620c8d4b1c84eb8677f73,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/549,,, 1358321208,PR_kwDOCGYnMM5Q9lY4,553,closed,0,Reformatted CLI examples in docs,9599,simonw,"Refs: - #551 ---- :books: Documentation preview :books:: https://sqlite-utils--553.org.readthedocs.build/en/553/ ",2023-05-21T20:44:34Z,2023-05-21T20:57:27Z,2023-05-21T20:57:23Z,2023-05-21T20:57:22Z,d8fe1b0d899faaaa3d4714a39328f4c24932278f,,,,,0,21036a5084a2c846a05feb6bced3111d849bbe3c,e240133b11588d31dc22c632f7a7ca636c72978d,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/553,,, 1406821147,PR_kwDOCGYnMM5T2mMb,560,closed,0,Use sqlean if available in environment,9599,simonw,"Refs: - #559 ---- :books: Documentation preview :books:: https://sqlite-utils--560.org.readthedocs.build/en/560/ ",2023-06-25T19:48:48Z,2023-06-26T08:21:00Z,2023-06-25T23:25:51Z,2023-06-25T23:25:51Z,f5c63088e1454811ce8361208b72297408eb5237,,,,,0,5e7d27e5df024ce1f45e3a850c4e0f65e765cccd,2747257a3334d55e890b40ec58fada57ae8cfbfd,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/560,,, 1445438054,PR_kwDOCGYnMM5WJ6Jm,573,closed,0,feat: Implement a prepare_connection plugin hook,15178711,asg017,"Just like the [Datasette prepare_connection hook](https://docs.datasette.io/en/stable/plugin_hooks.html#prepare-connection-conn-database-datasette), this PR adds a similar hook for the `sqlite-utils` plugin system. The sole argument is `conn`, since I don't believe a `database` or `datasette` argument would be relevant here. I want to do this so I can release `sqlite-utils` plugins for my [SQLite extensions](https://github.com/asg017/sqlite-ecosystem), similar to the Datasette plugins I've release for them. An example plugin: https://gist.github.com/asg017/d7cdf0d56e2be87efda28cebee27fa3c ```bash $ sqlite-utils install https://gist.github.com/asg017/d7cdf0d56e2be87efda28cebee27fa3c/archive/5f5ad549a40860787629c69ca120a08c32519e99.zip $ sqlite-utils memory 'select hello(""alex"") as response' [{""response"": ""Hello, alex!""}] ``` Refs: - #574 ---- :books: Documentation preview :books:: https://sqlite-utils--573.org.readthedocs.build/en/573/ ",2023-07-22T22:48:44Z,2023-07-22T22:59:09Z,2023-07-22T22:59:09Z,2023-07-22T22:59:09Z,3f80a026983d3e634f05a46f2a6da162b5139dd9,,,,,0,faf398fe075f60929337d3cd0f12309fc4229a3c,091c63cfbf7b40e99e2017a3c37619c7689cc447,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/573,,, 1479795255,PR_kwDOCGYnMM5YM-I3,584,closed,0,.transform() instead of modifying sqlite_master for add_foreign_keys,9599,simonw,"Refs: - #577 ---- :books: Documentation preview :books:: https://sqlite-utils--584.org.readthedocs.build/en/584/ ",2023-08-17T23:32:45Z,2023-08-18T00:48:13Z,2023-08-18T00:48:08Z,2023-08-18T00:48:08Z,509857ee8724f73760f3631b69c26f9047381187,,,,,0,291505084e652972ad806383250757d41d596d38,1dc6b5aa644a92d3654f7068110ed7930989ce71,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/584,,, 1504920193,PR_kwDOCGYnMM5Zs0KB,591,closed,0,Test against Python 3.12 preview,9599,simonw,"https://dev.to/hugovk/help-test-python-312-beta-1508/ ---- :books: Documentation preview :books:: https://sqlite-utils--591.org.readthedocs.build/en/591/ ",2023-09-06T16:10:00Z,2023-11-04T00:58:03Z,2023-11-04T00:58:02Z,,ac0db3c705355178bd5a337b8dd74df141b12c7a,,,,,0,1f14df1de4a214b12abfba6edd61a4bfa0b8473e,347fdc865e91b8d3410f49a5c9d5b499fbb594c1,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/591,,, 1507097949,PR_kwDOCGYnMM5Z1H1d,593,closed,0,".transform() now preserves rowid values, refs #592",9599,simonw,"Refs: - #592 - [x] Tests against weird shaped tables I need to test that this works against: - `rowid` tables - Tables that have a column called `rowid` even though they are not rowid tables ---- :books: Documentation preview :books:: https://sqlite-utils--593.org.readthedocs.build/en/593/ ",2023-09-08T01:02:28Z,2023-09-10T17:44:59Z,2023-09-09T00:45:30Z,2023-09-09T00:45:30Z,1c6ea54338e24fcebcee4e2f9c170ee300a5d946,,,,,0,b86374f705d1f4143a51634b30289cb48add0ea2,5d123f031fc4fadc98f508e0ef6b7b6671e86155,OWNER,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/593,,, 1535767490,PR_kwDOCGYnMM5bifPC,596,closed,0,"Fixes mapping for time fields related to mysql, closes #522",4420927,nezhar,"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 ---- :books: Documentation preview :books:: https://sqlite-utils--596.org.readthedocs.build/en/596/ ",2023-09-29T13:41:48Z,2023-11-04T00:49:50Z,2023-11-04T00:49:50Z,2023-11-04T00:49:50Z,347fdc865e91b8d3410f49a5c9d5b499fbb594c1,,,,,0,ab12125b3f7d0ef327b08d95f27c6c4cec6fdfb3,622c3a5a7dd53a09c029e2af40c2643fe7579340,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/596,,, 1542299634,PR_kwDOCGYnMM5b7Z_y,598,closed,0,Fixed issue #433 - CLI eats cursor,62745,spookylukey,"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)` These iterables are consumed later, outside the `with file_progress()` block, which consumes the underlying iterator, and in turn updates the progress bar. This 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). The fix is to move consumption of the `docs` iterators within the progress bar block. ( (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). Note that Github diff obscures the simplicity of this diff, it's just indenting a block of code. ---- :books: Documentation preview :books:: https://sqlite-utils--598.org.readthedocs.build/en/598/ ",2023-10-04T18:06:58Z,2023-11-04T00:46:55Z,2023-11-04T00:40:30Z,2023-11-04T00:40:30Z,37273d7f63f08872aa1c90c4233a0580e384ac19,,,,,0,76113d1cb1387811d556fb7a32e0628492c34aea,622c3a5a7dd53a09c029e2af40c2643fe7579340,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/598,,, 1586779743,PR_kwDOCGYnMM5elFZf,600,closed,0,Add spatialite arm64 linux path,37802088,MikeCoats,"According to both [Debian](https://packages.debian.org/bookworm/arm64/libsqlite3-mod-spatialite/filelist) and [Ubuntu](https://packages.ubuntu.com/mantic/arm64/libsqlite3-mod-spatialite/filelist), the correct “target triple” for arm64 is `aarch64-linux-gnu`, so we should be looking in `/usr/lib/aarch64-linux-gnu` for `mod_spatialite.so`. I can confirm that on both of my Debian arm64 SBCs, `libsqlite3-mod-spatialite` installs to that path. ``` $ ls -l /usr/lib/*/*spatial* lrwxrwxrwx 1 root root 23 Dec 1 2022 /usr/lib/aarch64-linux-gnu/mod_spatialite.so -> mod_spatialite.so.7.1.0 lrwxrwxrwx 1 root root 23 Dec 1 2022 /usr/lib/aarch64-linux-gnu/mod_spatialite.so.7 -> mod_spatialite.so.7.1.0 -rw-r--r-- 1 root root 7348584 Dec 1 2022 /usr/lib/aarch64-linux-gnu/mod_spatialite.so.7.1.0 ``` This is a set of before and after snippets of pytest’s output for this PR. ### Before ``` $ pytest tests/test_get.py ...... [ 73%] tests/test_gis.py ssssssssssss [ 75%] tests/test_hypothesis.py .... [ 75%] ``` ### After ``` $ pytest tests/test_get.py ...... [ 73%] tests/test_gis.py ............ [ 75%] tests/test_hypothesis.py .... [ 75%] ``` Issue: #599 ---- :books: Documentation preview :books:: https://sqlite-utils--600.org.readthedocs.build/en/600/ ",2023-11-03T22:23:26Z,2023-11-04T00:34:33Z,2023-11-04T00:31:49Z,2023-11-04T00:31:49Z,b92ea4793ce4dcb73cf762aae634ab72f65ec50f,,,,,0,b1a60766a4150268557c4445297087a3f076be01,622c3a5a7dd53a09c029e2af40c2643fe7579340,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/600,,, 1608050242,PR_kwDOCGYnMM5f2OZC,604,closed,0,Add more STRICT table support,16437338,tkhattra,"- https://github.com/simonw/sqlite-utils/issues/344#issuecomment-982014776 Make `table.transform()` preserve STRICT mode. ---- :books: Documentation preview :books:: https://sqlite-utils--604.org.readthedocs.build/en/604/ ",2023-11-19T19:38:53Z,2023-12-08T05:17:20Z,2023-12-08T05:05:27Z,2023-12-08T05:05:27Z,1500c19bd0f31b2e7f28a5ec2d7bfa133a2e4d4c,,,,,0,61c6e26cf922c70b65b161473723ff9d869a04a5,9286c1ba432e890b1bb4b2a1f847b15364c1fa18,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/604,,,