{"html_url": "https://github.com/simonw/datasette/pull/1789#issuecomment-1223347322", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1789", "id": 1223347322, "node_id": "IC_kwDOBm6k_c5I6sx6", "user": {"value": 15178711, "label": "asg017"}, "created_at": "2022-08-23T00:03:20Z", "updated_at": "2022-08-23T00:03:20Z", "author_association": "CONTRIBUTOR", "body": "@simonw to build the extension on ubuntu, you can run:\r\n\r\n```\r\napt-get update && apt-get install libsqlite3-dev gcc\r\ngcc ext.c -fPIC -shared -o ext.so\r\n```\r\n\r\nI'm not the best with Actions, but if you set the cache key to `ext.c`, run those two commands to download dependencies + compile to `ext.so`, then the unit test should pick it up and run it correctly. Let me know if you want me to update the PR with that added", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1344823170, "label": "Add new entrypoint option to `--load-extension`"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/235#issuecomment-1223378004", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/235", "id": 1223378004, "node_id": "IC_kwDOCGYnMM5I60RU", "user": {"value": 1558033, "label": "wpears"}, "created_at": "2022-08-23T00:44:11Z", "updated_at": "2022-08-23T00:44:11Z", "author_association": "NONE", "body": "This bug affects me as well. Env:\r\n\r\n```\r\nPython 3.8.12\r\nsqlite-utils, version 3.28\r\nsqlite3 3.32.3\r\nMacOS Big Sur 11.6.7\r\nIntel\r\n```\r\n\r\nSimilar to @mdrovdahl, I was able to work around this bug by piping the SQL string constructed in `add_foreign_keys` to the `sqlite3` command itself. Specifically, if you're trying to patch this yourself, replace [lines 1026-1039 of db.py in your site packages](https://github.com/simonw/sqlite-utils/blob/main/sqlite_utils/db.py#L1026-L1039) with something similar to the following:\r\n\r\n```\r\nprint(\"PRAGMA writable_schema = 1;\")\r\nfor table_name, new_sql in table_sql.items():\r\n print(\"UPDATE sqlite_master SET sql = '{}' WHERE name = '{}';\".format(\r\n new_sql, table_name)\r\n )\r\nprint(\"PRAGMA writable_schema = 0;\")\r\nprint(\"VACUUM;\")\r\n```\r\n \r\nThen from your terminal:\r\n`db-to-sqlite \"\" your.db --all > output.sql && sqlite3 your.db < output.sql`\r\n\r\nIf you want to run this with `-p`, you'll have to actually open a file in code to write to instead of redirecting the output.", "reactions": "{\"total_count\": 3, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 3, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 810618495, "label": "Extract columns cannot create foreign key relation: sqlite3.OperationalError: table sqlite_master may not be modified"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1791#issuecomment-1224080105", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1791", "id": 1224080105, "node_id": "IC_kwDOBm6k_c5I9frp", "user": {"value": 1780782, "label": "ment4list"}, "created_at": "2022-08-23T13:29:51Z", "updated_at": "2022-08-23T13:29:51Z", "author_association": "NONE", "body": "For now I've installed datasette via homebrew.\r\n\r\nI then converted my CSV to SQLite via sqlite-utils as per the article [Cleaning data with sqlite](https://datasette.io/tutorials/clean-data).\r\n\r\nNow I can use my `metadata.json` file as follows:\r\n\r\n`datasette mydb.db -m mymetadata.json` ", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1347717749, "label": "Updating metadata.json on Datasette for MacOS"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224264744", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224264744, "node_id": "IC_kwDOCGYnMM5I-Mwo", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T15:51:29Z", "updated_at": "2022-08-23T15:53:29Z", "author_association": "OWNER", "body": "Jeff suggested `db[table].(..., alter=True)` for this.\r\n\r\n```python\r\n db[\"urls\"].create(\r\n {\r\n \"url\": str,\r\n \"crawled\": bool,\r\n \"body\": str,\r\n \"headers\": dict,\r\n \"status\": int,\r\n \"status_text\": str,\r\n },\r\n pk=\"url\",\r\n defaults={\"crawled\": False},\r\n if_not_exists=True,\r\n alter=True,\r\n )\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224268273", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224268273, "node_id": "IC_kwDOCGYnMM5I-Nnx", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T15:54:24Z", "updated_at": "2022-08-23T15:54:24Z", "author_association": "OWNER", "body": "I'm not crazy about having to pass both `alter=True` and `if_not_exists=True` - maybe `alter` should imply `if_not_exists`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224271324", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224271324, "node_id": "IC_kwDOCGYnMM5I-OXc", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T15:56:58Z", "updated_at": "2022-08-23T15:56:58Z", "author_association": "OWNER", "body": "Should passing `alter=True` also drop any columns that aren't included in the new table structure?\r\n\r\nIt could even spot column types that aren't correct and fix those.\r\n\r\nIs that consistent with the expectations set by how `alter=True` works elsewhere?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224272854", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224272854, "node_id": "IC_kwDOCGYnMM5I-OvW", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T15:58:14Z", "updated_at": "2022-08-23T15:58:14Z", "author_association": "OWNER", "body": "Could call it `ensure=True` here if it works differently enough from `alter=True` that the behavior could be confusing.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224278280", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224278280, "node_id": "IC_kwDOCGYnMM5I-QEI", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T16:02:07Z", "updated_at": "2022-08-23T16:02:07Z", "author_association": "OWNER", "body": "Thinking about this more, I think `alter=True` is a good name for this option even if it does more than the same option on `.insert()`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224280225", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224280225, "node_id": "IC_kwDOCGYnMM5I-Qih", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T16:03:33Z", "updated_at": "2022-08-23T16:03:33Z", "author_association": "OWNER", "body": "Maybe there should be a separate `table.alter(...)` method that does the actual work here, with `.create(..., alter=True)` as syntactic sugar for triggering that if the table exists already.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224283367", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224283367, "node_id": "IC_kwDOCGYnMM5I-RTn", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T16:05:55Z", "updated_at": "2022-08-23T16:05:55Z", "author_association": "OWNER", "body": "... but that's what the `table.transform(...)` method does already!\r\n\r\nSo maybe this is actually a `transform=True` parameter to `create()` that triggers `table.transform(...)` if necessary.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224382336", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224382336, "node_id": "IC_kwDOCGYnMM5I-peA", "user": {"value": 50527, "label": "jefftriplett"}, "created_at": "2022-08-23T17:16:13Z", "updated_at": "2022-08-23T17:16:13Z", "author_association": "CONTRIBUTOR", "body": "> Should passing `alter=True` also drop any columns that aren't included in the new table structure?\r\n> \r\n> It could even spot column types that aren't correct and fix those.\r\n> \r\n> Is that consistent with the expectations set by how `alter=True` works elsewhere?\r\n\r\nI would lean towards not dropping them (or making a `drop=True` or `drop_columns=True`or `drop_missing_columns=True`) to work with existing tables easier. \r\n\r\nI do like that sqlite-utils mostly just works with existing tables but it's also nice to add to existing fields in a few cases. \r\n\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224385575", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224385575, "node_id": "IC_kwDOCGYnMM5I-qQn", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T17:19:00Z", "updated_at": "2022-08-23T17:19:00Z", "author_association": "OWNER", "body": "Initial prototype:\r\n```diff\r\ndiff --git a/sqlite_utils/db.py b/sqlite_utils/db.py\r\nindex 18a442a..03fd345 100644\r\n--- a/sqlite_utils/db.py\r\n+++ b/sqlite_utils/db.py\r\n@@ -875,6 +875,7 @@ class Database:\r\n hash_id_columns: Optional[Iterable[str]] = None,\r\n extracts: Optional[Union[Dict[str, str], List[str]]] = None,\r\n if_not_exists: bool = False,\r\n+ transform: bool = False,\r\n ) -> \"Table\":\r\n \"\"\"\r\n Create a table with the specified name and the specified ``{column_name: type}`` columns.\r\n@@ -892,7 +893,39 @@ class Database:\r\n :param hash_id_columns: List of columns to be used when calculating the hash ID for a row\r\n :param extracts: List or dictionary of columns to be extracted during inserts, see :ref:`python_api_extracts`\r\n :param if_not_exists: Use ``CREATE TABLE IF NOT EXISTS``\r\n- \"\"\"\r\n+ :param transform: If table already exists, transform it to fit the specified schema\r\n+ \"\"\"\r\n+ # Transform table to match the new definition if table already exists:\r\n+ if transform and self[name].exists():\r\n+ # First add missing columns and columns to drop\r\n+ existing_columns = self[name].columns_dict\r\n+ missing_columns = dict(\r\n+ (col_name, col_type)\r\n+ for col_name, col_type in columns.items()\r\n+ if col_name not in existing_columns\r\n+ )\r\n+ columns_to_drop = [\r\n+ column for column in existing_columns if column not in columns\r\n+ ]\r\n+ if missing_columns:\r\n+ for col_name, col_type in missing_columns.items():\r\n+ self[name].add_column(col_name, col_type)\r\n+ # Do we need to reset the column order?\r\n+ column_order = None\r\n+ if list(existing_columns) != list(columns):\r\n+ column_order = list(columns)\r\n+ # Only run .transform() if there is something to do\r\n+ # TODO: this misses changes like pk= without also column changes\r\n+ if columns_to_drop or missing_columns or column_order:\r\n+ self[name].transform(\r\n+ types=columns,\r\n+ drop=columns_to_drop,\r\n+ column_order=column_order,\r\n+ not_null=not_null,\r\n+ defaults=defaults,\r\n+ pk=pk,\r\n+ )\r\n+ return cast(Table, self[name])\r\n sql = self.create_table_sql(\r\n name=name,\r\n columns=columns,\r\n@@ -1477,6 +1510,7 @@ class Table(Queryable):\r\n hash_id_columns: Optional[Iterable[str]] = None,\r\n extracts: Optional[Union[Dict[str, str], List[str]]] = None,\r\n if_not_exists: bool = False,\r\n+ transform: bool = False,\r\n ) -> \"Table\":\r\n \"\"\"\r\n Create a table with the specified columns.\r\n@@ -1508,6 +1542,7 @@ class Table(Queryable):\r\n hash_id_columns=hash_id_columns,\r\n extracts=extracts,\r\n if_not_exists=if_not_exists,\r\n+ transform=transform,\r\n )\r\n return self\r\n ```\r\nNeeds more thought about how things like just a change to `pk=` should work.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224386951", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224386951, "node_id": "IC_kwDOCGYnMM5I-qmH", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T17:20:07Z", "updated_at": "2022-08-23T17:20:07Z", "author_association": "OWNER", "body": "Example of that prototype working:\r\n```pycon\r\n>>> from sqlite_utils import Database\r\n>>> db = Database(memory=True)\r\n>>> db[\"dogs\"].create({\"id\": int, \"name\": str}, pk=\"id\")\r\n\r\n>>> db[\"dogs\"].create({\"id\": int, \"name\": str, \"age\": int}, pk=\"id\", transform=True)\r\n
\r\n```", "reactions": "{\"total_count\": 1, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 1, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224388810", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224388810, "node_id": "IC_kwDOCGYnMM5I-rDK", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T17:21:16Z", "updated_at": "2022-08-23T17:21:16Z", "author_association": "OWNER", "body": "Also needs comprehensive tests and documentation.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/pull/468#issuecomment-1224412060", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/468", "id": 1224412060, "node_id": "IC_kwDOCGYnMM5I-wuc", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2022-08-23T17:30:24Z", "updated_at": "2022-08-27T23:11:44Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/sqlite-utils/pull/468?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) Report\n> Merging [#468](https://codecov.io/gh/simonw/sqlite-utils/pull/468?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) (fc38480) into [main](https://codecov.io/gh/simonw/sqlite-utils/commit/c5f8a2eb1a81a18b52825cc649112f71fe419b12?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) (c5f8a2e) will **decrease** coverage by `0.12%`.\n> The diff coverage is `88.88%`.\n\n> :exclamation: Current head fc38480 differs from pull request most recent head 2f6a64f. Consider uploading reports for the commit 2f6a64f to get more accurate results\n\n```diff\n@@ Coverage Diff @@\n## main #468 +/- ##\n==========================================\n- Coverage 96.60% 96.47% -0.13% \n==========================================\n Files 6 6 \n Lines 2590 2640 +50 \n==========================================\n+ Hits 2502 2547 +45 \n- Misses 88 93 +5 \n```\n\n\n| [Impacted Files](https://codecov.io/gh/simonw/sqlite-utils/pull/468?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) | Coverage \u0394 | |\n|---|---|---|\n| [sqlite\\_utils/cli.py](https://codecov.io/gh/simonw/sqlite-utils/pull/468/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison#diff-c3FsaXRlX3V0aWxzL2NsaS5weQ==) | `95.86% <66.66%> (-0.09%)` | :arrow_down: |\n| [sqlite\\_utils/db.py](https://codecov.io/gh/simonw/sqlite-utils/pull/468/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison#diff-c3FsaXRlX3V0aWxzL2RiLnB5) | `97.31% <90.19%> (-0.23%)` | :arrow_down: |\n\nHelp us with your feedback. Take ten seconds to tell us [how you rate us](https://about.codecov.io/nps?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison). Have a feature suggestion? [Share it here.](https://app.codecov.io/gh/feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison)\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348294436, "label": "db[table].create(..., transform=True) and create-table --transform"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1789#issuecomment-1224569313", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1789", "id": 1224569313, "node_id": "IC_kwDOBm6k_c5I_XHh", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T18:33:08Z", "updated_at": "2022-08-23T18:33:08Z", "author_association": "OWNER", "body": "I'm going to merge as-is and then figure out the GitHub Actions bit separately. Thanks!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1344823170, "label": "Add new entrypoint option to `--load-extension`"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1789#issuecomment-1224592097", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1789", "id": 1224592097, "node_id": "IC_kwDOBm6k_c5I_crh", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T18:42:51Z", "updated_at": "2022-08-23T18:42:51Z", "author_association": "OWNER", "body": "Looks like it's not actually necessary to `apt-get install` anything extra in order to compile that test extension:\r\n\r\n\"image\"\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1344823170, "label": "Add new entrypoint option to `--load-extension`"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1792#issuecomment-1224606178", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1792", "id": 1224606178, "node_id": "IC_kwDOBm6k_c5I_gHi", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2022-08-23T18:49:07Z", "updated_at": "2022-08-24T00:11:37Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1792?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) Report\n> Merging [#1792](https://codecov.io/gh/simonw/datasette/pull/1792?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) (f61cfb7) into [main](https://codecov.io/gh/simonw/datasette/commit/fd1086c6867f3e3582b1eca456e4ea95f6cecf8b?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) (fd1086c) will **increase** coverage by `0.04%`.\n> The diff coverage is `n/a`.\n\n```diff\n@@ Coverage Diff @@\n## main #1792 +/- ##\n==========================================\n+ Coverage 91.66% 91.71% +0.04% \n==========================================\n Files 38 38 \n Lines 4705 4705 \n==========================================\n+ Hits 4313 4315 +2 \n+ Misses 392 390 -2 \n```\n\n\n| [Impacted Files](https://codecov.io/gh/simonw/datasette/pull/1792?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) | Coverage \u0394 | |\n|---|---|---|\n| [datasette/database.py](https://codecov.io/gh/simonw/datasette/pull/1792/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison#diff-ZGF0YXNldHRlL2RhdGFiYXNlLnB5) | `94.13% <0.00%> (+0.65%)` | :arrow_up: |\n\nHelp us with your feedback. Take ten seconds to tell us [how you rate us](https://about.codecov.io/nps?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison). Have a feature suggestion? [Share it here.](https://app.codecov.io/gh/feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison)\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348394901, "label": "Test `--load-extension` in GitHub Actions"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1792#issuecomment-1224869578", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1792", "id": 1224869578, "node_id": "IC_kwDOBm6k_c5JAgbK", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T20:47:59Z", "updated_at": "2022-08-23T20:47:59Z", "author_association": "OWNER", "body": "Really weird: the tests are failing on Python 3.7 only for some reason, in a test that should be completely unrelated to this extension feature.\r\n\r\n\"image\"\r\n\r\nhttps://github.com/simonw/datasette/runs/7982525580?check_suite_focus=true", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348394901, "label": "Test `--load-extension` in GitHub Actions"}, "performed_via_github_app": null}