Last active
December 28, 2024 00:24
-
-
Save pydanny/6e57acc3c1afa9b20b02d989714f3d97 to your computer and use it in GitHub Desktop.
fasthtml/not-nulls.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"metadata": {}, | |
"id": "5c7370ab", | |
"cell_type": "markdown", | |
"source": "# Not nulls (#542)" | |
}, | |
{ | |
"metadata": {}, | |
"id": "7a5f2c24", | |
"cell_type": "markdown", | |
"source": "Reviewing bug report in [#542](https://github.com/AnswerDotAI/fasthtml/issues/542) of fasthtml" | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"id": "7572b321", | |
"cell_type": "code", | |
"source": "import fasthtml.common as fh", | |
"execution_count": 2, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"id": "79f6cfef", | |
"cell_type": "markdown", | |
"source": "Create the database in memory so we don't have to worry about dropping tables" | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"id": "bb7060ad", | |
"cell_type": "code", | |
"source": "", | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"id": "b39b430d", | |
"cell_type": "code", | |
"source": "db = fh.database(':memory:')\n\nusers = db.t.users\nusers.create(\n {\n \"id\":int,\n \"name\":str,\n \"email\":str,\n \"pwd\":str,\n \"phone\":str,\n \"organization\":str,\n \"role\":int\n },\n pk='id',\n not_null={'email'},\n defaults={'role': 1},\n )", | |
"execution_count": 5, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 5, | |
"data": { | |
"text/plain": "<Table users (id, name, email, pwd, phone, organization, role)>" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"id": "3f9169fb", | |
"cell_type": "markdown", | |
"source": "Insert a valid record, this is the happy path." | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"id": "e3cd07f9", | |
"cell_type": "code", | |
"source": "user = users.insert(\n dict(\n id=1,\n name='Daniel',\n email='[email protected]',\n pwd='sekrit',\n phone='1234567',\n organization='Answer',\n role=1\n )\n)", | |
"execution_count": 6, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"id": "0e8d1fec", | |
"cell_type": "code", | |
"source": "user", | |
"execution_count": 7, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 7, | |
"data": { | |
"text/plain": "{'id': 1,\n 'name': 'Daniel',\n 'email': '[email protected]',\n 'pwd': 'sekrit',\n 'phone': '1234567',\n 'organization': 'Answer',\n 'role': 1}" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"id": "a897c626", | |
"cell_type": "code", | |
"source": "users()", | |
"execution_count": 8, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"execution_count": 8, | |
"data": { | |
"text/plain": "[{'id': 1,\n 'name': 'Daniel',\n 'email': '[email protected]',\n 'pwd': 'sekrit',\n 'phone': '1234567',\n 'organization': 'Answer',\n 'role': 1}]" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"id": "3061a616", | |
"cell_type": "markdown", | |
"source": "Attempt to insert a valid record, this is the sad path that CORRECTLY raises a `ConstraintError` because it is missing the email field." | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"id": "8fd97c3e", | |
"cell_type": "code", | |
"source": "user = users.insert(\n dict(\n id=2,\n name='John',\n pwd='sekrit',\n phone='123456',\n organization='No Answer',\n role=1\n )\n)", | |
"execution_count": 9, | |
"outputs": [ | |
{ | |
"output_type": "error", | |
"ename": "ConstraintError", | |
"evalue": "NOT NULL constraint failed: users.email", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
"\u001b[0;31mConstraintError\u001b[0m Traceback (most recent call last)", | |
"Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m user \u001b[38;5;241m=\u001b[39m \u001b[43musers\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minsert\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mdict\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mid\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mJohn\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[43mpwd\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43msekrit\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[43mphone\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m123456\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7\u001b[0m \u001b[43m \u001b[49m\u001b[43morganization\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mNo Answer\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8\u001b[0m \u001b[43m \u001b[49m\u001b[43mrole\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\n\u001b[1;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 10\u001b[0m \u001b[43m)\u001b[49m\n", | |
"File \u001b[0;32m~/git/fastlite/fastlite/kw.py:195\u001b[0m, in \u001b[0;36minsert\u001b[0;34m(self, record, pk, foreign_keys, column_order, not_null, defaults, hash_id, hash_id_columns, alter, ignore, replace, extracts, conversions, columns, strict, **kwargs)\u001b[0m\n\u001b[1;32m 193\u001b[0m record \u001b[38;5;241m=\u001b[39m {\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mrecord, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs}\n\u001b[1;32m 194\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m record: \u001b[38;5;28;01mreturn\u001b[39;00m {}\n\u001b[0;32m--> 195\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_orig_insert\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 196\u001b[0m \u001b[43m \u001b[49m\u001b[43mrecord\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrecord\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpk\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpk\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mforeign_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mforeign_keys\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcolumn_order\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcolumn_order\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnot_null\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnot_null\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 197\u001b[0m \u001b[43m \u001b[49m\u001b[43mdefaults\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdefaults\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhash_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhash_id\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhash_id_columns\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhash_id_columns\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43malter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43malter\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mignore\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mignore\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 198\u001b[0m \u001b[43m \u001b[49m\u001b[43mreplace\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreplace\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mextracts\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextracts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconversions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconversions\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcolumns\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstrict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstrict\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 199\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_last(legacy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", | |
"File \u001b[0;32m~/git/apswutils/apswutils/db.py:3057\u001b[0m, in \u001b[0;36mTable.insert\u001b[0;34m(self, record, pk, foreign_keys, column_order, not_null, defaults, hash_id, hash_id_columns, alter, ignore, replace, extracts, conversions, columns, strict)\u001b[0m\n\u001b[1;32m 3006\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minsert\u001b[39m(\n\u001b[1;32m 3007\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 3008\u001b[0m record: Dict[\u001b[38;5;28mstr\u001b[39m, Any],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 3022\u001b[0m strict: Optional[Union[\u001b[38;5;28mbool\u001b[39m, Default]] \u001b[38;5;241m=\u001b[39m DEFAULT,\n\u001b[1;32m 3023\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTable\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 3024\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 3025\u001b[0m \u001b[38;5;124;03m Insert a single record into the table. The table will be created with a schema that matches\u001b[39;00m\n\u001b[1;32m 3026\u001b[0m \u001b[38;5;124;03m the inserted record if it does not already exist, see :ref:`python_api_creating_tables`.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 3055\u001b[0m \u001b[38;5;124;03m :param strict: Boolean, apply STRICT mode if creating the table.\u001b[39;00m\n\u001b[1;32m 3056\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 3057\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minsert_all\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3058\u001b[0m \u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mrecord\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3059\u001b[0m \u001b[43m \u001b[49m\u001b[43mpk\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpk\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3060\u001b[0m \u001b[43m \u001b[49m\u001b[43mforeign_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mforeign_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3061\u001b[0m \u001b[43m \u001b[49m\u001b[43mcolumn_order\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcolumn_order\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3062\u001b[0m \u001b[43m \u001b[49m\u001b[43mnot_null\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnot_null\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3063\u001b[0m \u001b[43m \u001b[49m\u001b[43mdefaults\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdefaults\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3064\u001b[0m \u001b[43m \u001b[49m\u001b[43mhash_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhash_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3065\u001b[0m \u001b[43m \u001b[49m\u001b[43mhash_id_columns\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhash_id_columns\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3066\u001b[0m \u001b[43m \u001b[49m\u001b[43malter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43malter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3067\u001b[0m \u001b[43m \u001b[49m\u001b[43mignore\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mignore\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3068\u001b[0m \u001b[43m \u001b[49m\u001b[43mreplace\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreplace\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3069\u001b[0m \u001b[43m \u001b[49m\u001b[43mextracts\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextracts\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3070\u001b[0m \u001b[43m \u001b[49m\u001b[43mconversions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconversions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3071\u001b[0m \u001b[43m \u001b[49m\u001b[43mcolumns\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3072\u001b[0m \u001b[43m \u001b[49m\u001b[43mstrict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstrict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3073\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", | |
"File \u001b[0;32m~/git/fastlite/fastlite/kw.py:168\u001b[0m, in \u001b[0;36minsert_all\u001b[0;34m(self, records, pk, foreign_keys, column_order, not_null, defaults, batch_size, hash_id, hash_id_columns, alter, ignore, replace, truncate, extracts, conversions, columns, strict, upsert, analyze, xtra, **kwargs)\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\n\u001b[1;32m 167\u001b[0m records \u001b[38;5;241m=\u001b[39m [{\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mo, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mxtra} \u001b[38;5;28;01mfor\u001b[39;00m o \u001b[38;5;129;01min\u001b[39;00m records]\n\u001b[0;32m--> 168\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_orig_insert_all\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 169\u001b[0m \u001b[43m \u001b[49m\u001b[43mrecords\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrecords\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpk\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpk\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mforeign_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mforeign_keys\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcolumn_order\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcolumn_order\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnot_null\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnot_null\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 170\u001b[0m \u001b[43m \u001b[49m\u001b[43mdefaults\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdefaults\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbatch_size\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbatch_size\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhash_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhash_id\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhash_id_columns\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhash_id_columns\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43malter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43malter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 171\u001b[0m \u001b[43m \u001b[49m\u001b[43mignore\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mignore\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreplace\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreplace\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtruncate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtruncate\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mextracts\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextracts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconversions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconversions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 172\u001b[0m \u001b[43m \u001b[49m\u001b[43mcolumns\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstrict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstrict\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mupsert\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mupsert\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43manalyze\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43manalyze\u001b[49m\u001b[43m)\u001b[49m\n", | |
"File \u001b[0;32m~/git/apswutils/apswutils/db.py:3190\u001b[0m, in \u001b[0;36mTable.insert_all\u001b[0;34m(self, records, pk, foreign_keys, column_order, not_null, defaults, batch_size, hash_id, hash_id_columns, alter, ignore, replace, truncate, extracts, conversions, columns, upsert, analyze, strict)\u001b[0m\n\u001b[1;32m 3184\u001b[0m all_columns \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 3185\u001b[0m column \u001b[38;5;28;01mfor\u001b[39;00m column \u001b[38;5;129;01min\u001b[39;00m record \u001b[38;5;28;01mif\u001b[39;00m column \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m all_columns\n\u001b[1;32m 3186\u001b[0m ]\n\u001b[1;32m 3188\u001b[0m first \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m-> 3190\u001b[0m rows\u001b[38;5;241m.\u001b[39mextend(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minsert_chunk\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3191\u001b[0m \u001b[43m \u001b[49m\u001b[43malter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3192\u001b[0m \u001b[43m \u001b[49m\u001b[43mextracts\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3193\u001b[0m \u001b[43m \u001b[49m\u001b[43mchunk\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3194\u001b[0m \u001b[43m \u001b[49m\u001b[43mall_columns\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3195\u001b[0m \u001b[43m \u001b[49m\u001b[43mhash_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3196\u001b[0m \u001b[43m \u001b[49m\u001b[43mhash_id_columns\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3197\u001b[0m \u001b[43m \u001b[49m\u001b[43mupsert\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3198\u001b[0m \u001b[43m \u001b[49m\u001b[43mpk\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3199\u001b[0m \u001b[43m \u001b[49m\u001b[43mnot_null\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3200\u001b[0m \u001b[43m \u001b[49m\u001b[43mconversions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3201\u001b[0m \u001b[43m \u001b[49m\u001b[43mnum_records_processed\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3202\u001b[0m \u001b[43m \u001b[49m\u001b[43mreplace\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3203\u001b[0m \u001b[43m \u001b[49m\u001b[43mignore\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3204\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 3206\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m analyze:\n\u001b[1;32m 3207\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39manalyze()\n", | |
"File \u001b[0;32m~/git/apswutils/apswutils/db.py:2932\u001b[0m, in \u001b[0;36mTable.insert_chunk\u001b[0;34m(self, alter, extracts, chunk, all_columns, hash_id, hash_id_columns, upsert, pk, not_null, conversions, num_records_processed, replace, ignore)\u001b[0m\n\u001b[1;32m 2930\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m query, params \u001b[38;5;129;01min\u001b[39;00m queries_and_params:\n\u001b[1;32m 2931\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 2932\u001b[0m cursor \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdb\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\u001b[43mquery\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mtuple\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2933\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m: columns \u001b[38;5;241m=\u001b[39m [c[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m c \u001b[38;5;129;01min\u001b[39;00m cursor\u001b[38;5;241m.\u001b[39mdescription]\n\u001b[1;32m 2934\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m apsw\u001b[38;5;241m.\u001b[39mExecutionCompleteError: \u001b[38;5;28;01mcontinue\u001b[39;00m\n", | |
"File \u001b[0;32m~/git/apswutils/apswutils/db.py:434\u001b[0m, in \u001b[0;36mDatabase.execute\u001b[0;34m(self, sql, parameters)\u001b[0m\n\u001b[1;32m 432\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_tracer: \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_tracer(sql, parameters)\n\u001b[1;32m 433\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(parameters, \u001b[38;5;28mlist\u001b[39m): parameters \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m(parameters)\n\u001b[0;32m--> 434\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m parameters: \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\u001b[43msql\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparameters\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 435\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m: \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconn\u001b[38;5;241m.\u001b[39mexecute(sql)\n", | |
"File \u001b[0;32msrc/cursor.c:172\u001b[0m, in \u001b[0;36mresetcursor\u001b[0;34m()\u001b[0m\n", | |
"\u001b[0;31mConstraintError\u001b[0m: NOT NULL constraint failed: users.email" | |
] | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true | |
}, | |
"id": "891cc86d", | |
"cell_type": "code", | |
"source": "", | |
"execution_count": null, | |
"outputs": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3 (ipykernel)", | |
"language": "python" | |
}, | |
"language_info": { | |
"name": "python", | |
"version": "3.12.6", | |
"mimetype": "text/x-python", | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"pygments_lexer": "ipython3", | |
"nbconvert_exporter": "python", | |
"file_extension": ".py" | |
}, | |
"gist": { | |
"id": "6e57acc3c1afa9b20b02d989714f3d97", | |
"data": { | |
"description": "fasthtml/not-nulls.ipynb", | |
"public": true | |
} | |
}, | |
"_draft": { | |
"nbviewer_url": "https://gist.github.com/pydanny/6e57acc3c1afa9b20b02d989714f3d97" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment