Skip to content

Instantly share code, notes, and snippets.

@pydanny
Last active December 28, 2024 00:24
Show Gist options
  • Save pydanny/6e57acc3c1afa9b20b02d989714f3d97 to your computer and use it in GitHub Desktop.
Save pydanny/6e57acc3c1afa9b20b02d989714f3d97 to your computer and use it in GitHub Desktop.
fasthtml/not-nulls.ipynb
Display the source blob
Display the rendered blob
Raw
{
"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