sqlmodel 0.0.44__tar.gz → 0.0.45__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/PKG-INFO +1 -1
- sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial001_py310.py +30 -0
- sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial001_py311.py +30 -0
- sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial002_py310.py +21 -0
- sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial003_py310.py +18 -0
- sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial004_py310.py +22 -0
- sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial005_py310.py +18 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/pyproject.toml +2 -1
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/.agents/skills/sqlmodel/SKILL.md +27 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/__init__.py +2 -1
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/_compat.py +12 -3
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/main.py +6 -4
- sqlmodel-0.0.45/sqlmodel/sql/sqltypes.py +53 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/conftest.py +6 -0
- sqlmodel-0.0.45/tests/test_advanced/test_datetime/test_tutorial001.py +40 -0
- sqlmodel-0.0.45/tests/test_advanced/test_datetime/test_tutorial002.py +50 -0
- sqlmodel-0.0.45/tests/test_advanced/test_datetime/test_tutorial003.py +31 -0
- sqlmodel-0.0.45/tests/test_advanced/test_datetime/test_tutorial004.py +35 -0
- sqlmodel-0.0.45/tests/test_advanced/test_datetime/test_tutorial005.py +38 -0
- sqlmodel-0.0.45/tests/test_datetime.py +314 -0
- sqlmodel-0.0.45/tests/test_tutorial/test_update/__init__.py +0 -0
- sqlmodel-0.0.45/tests/test_tutorial/test_where/__init__.py +0 -0
- sqlmodel-0.0.44/sqlmodel/sql/sqltypes.py +0 -16
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/LICENSE +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/README.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/advanced/__init__.py +0 -0
- {sqlmodel-0.0.44/docs_src/advanced/decimal → sqlmodel-0.0.45/docs_src/advanced/datetime}/__init__.py +0 -0
- {sqlmodel-0.0.44/docs_src/advanced/uuid → sqlmodel-0.0.45/docs_src/advanced/decimal}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/advanced/decimal/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial → sqlmodel-0.0.45/docs_src/advanced/uuid}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/advanced/uuid/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/advanced/uuid/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/automatic_id_none_refresh → sqlmodel-0.0.45/docs_src/tutorial}/__init__.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/code_structure → sqlmodel-0.0.45/docs_src/tutorial/automatic_id_none_refresh}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/automatic_id_none_refresh/annotations/en/tutorial002.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/automatic_id_none_refresh/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/automatic_id_none_refresh/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/code_structure/tutorial001_py310 → sqlmodel-0.0.45/docs_src/tutorial/code_structure}/__init__.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/code_structure/tutorial002_py310 → sqlmodel-0.0.45/docs_src/tutorial/code_structure/tutorial001_py310}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial001_py310/app.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial001_py310/database.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial001_py310/models.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/connect → sqlmodel-0.0.45/docs_src/tutorial/code_structure/tutorial002_py310}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial002_py310/app.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial002_py310/database.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial002_py310/hero_model.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial002_py310/team_model.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/connect/create_tables → sqlmodel-0.0.45/docs_src/tutorial/connect}/__init__.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/connect/delete → sqlmodel-0.0.45/docs_src/tutorial/connect/create_tables}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/create_tables/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/connect/insert → sqlmodel-0.0.45/docs_src/tutorial/connect/delete}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/delete/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/connect/select → sqlmodel-0.0.45/docs_src/tutorial/connect/insert}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/insert/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/connect/update → sqlmodel-0.0.45/docs_src/tutorial/connect/select}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/select/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/select/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/select/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/select/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/select/tutorial005_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/create_db_and_table → sqlmodel-0.0.45/docs_src/tutorial/connect/update}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/update/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/delete → sqlmodel-0.0.45/docs_src/tutorial/create_db_and_table}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/create_db_and_table/annotations/en/tutorial003.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/create_db_and_table/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/create_db_and_table/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/create_db_and_table/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi → sqlmodel-0.0.45/docs_src/tutorial/delete}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/delete/annotations/en/tutorial002.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/delete/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/delete/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/app_testing → sqlmodel-0.0.45/docs_src/tutorial/fastapi}/__init__.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/app_testing/tutorial001_py310 → sqlmodel-0.0.45/docs_src/tutorial/fastapi/app_testing}/__init__.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/delete → sqlmodel-0.0.45/docs_src/tutorial/fastapi/app_testing/tutorial001_py310}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_001.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_002.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_003.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_004.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_005.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_006.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/main.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_extra_coverage.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_003.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_004.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_005.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_006.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/limit_and_offset → sqlmodel-0.0.45/docs_src/tutorial/fastapi/delete}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/delete/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/multiple_models → sqlmodel-0.0.45/docs_src/tutorial/fastapi/limit_and_offset}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/limit_and_offset/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/read_one → sqlmodel-0.0.45/docs_src/tutorial/fastapi/multiple_models}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/multiple_models/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/multiple_models/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/relationships → sqlmodel-0.0.45/docs_src/tutorial/fastapi/read_one}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/read_one/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/response_model → sqlmodel-0.0.45/docs_src/tutorial/fastapi/relationships}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/relationships/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/session_with_dependency → sqlmodel-0.0.45/docs_src/tutorial/fastapi/response_model}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/response_model/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/simple_hero_api → sqlmodel-0.0.45/docs_src/tutorial/fastapi/session_with_dependency}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/session_with_dependency/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/teams → sqlmodel-0.0.45/docs_src/tutorial/fastapi/simple_hero_api}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/simple_hero_api/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/fastapi/update → sqlmodel-0.0.45/docs_src/tutorial/fastapi/teams}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/teams/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/indexes → sqlmodel-0.0.45/docs_src/tutorial/fastapi/update}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/update/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/update/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/insert → sqlmodel-0.0.45/docs_src/tutorial/indexes}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/indexes/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/indexes/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/many_to_many → sqlmodel-0.0.45/docs_src/tutorial/insert}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/insert/annotations/en/tutorial003.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/insert/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/insert/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/insert/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/offset_and_limit → sqlmodel-0.0.45/docs_src/tutorial/many_to_many}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/many_to_many/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/many_to_many/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/many_to_many/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/one → sqlmodel-0.0.45/docs_src/tutorial/offset_and_limit}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/offset_and_limit/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/offset_and_limit/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/offset_and_limit/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/offset_and_limit/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/relationship_attributes → sqlmodel-0.0.45/docs_src/tutorial/one}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial005_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial006_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial007_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial008_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial009_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/relationship_attributes/back_populates → sqlmodel-0.0.45/docs_src/tutorial/relationship_attributes}/__init__.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/relationship_attributes/cascade_delete_relationships → sqlmodel-0.0.45/docs_src/tutorial/relationship_attributes/back_populates}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/back_populates/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/back_populates/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/back_populates/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/relationship_attributes/create_and_update_relationships → sqlmodel-0.0.45/docs_src/tutorial/relationship_attributes/cascade_delete_relationships}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial005_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/relationship_attributes/define_relationship_attributes → sqlmodel-0.0.45/docs_src/tutorial/relationship_attributes/create_and_update_relationships}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/create_and_update_relationships/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/relationship_attributes/read_relationships → sqlmodel-0.0.45/docs_src/tutorial/relationship_attributes/define_relationship_attributes}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/define_relationship_attributes/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/select → sqlmodel-0.0.45/docs_src/tutorial/relationship_attributes/read_relationships}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/read_relationships/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/read_relationships/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/update → sqlmodel-0.0.45/docs_src/tutorial/select}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/select/annotations/en/tutorial002.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/select/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/select/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/select/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/select/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.44/docs_src/tutorial/where → sqlmodel-0.0.45/docs_src/tutorial/update}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/annotations/en/tutorial002.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/annotations/en/tutorial004.md +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.44/sqlmodel/ext → sqlmodel-0.0.45/docs_src/tutorial/where}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial001_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial002_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial003_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial004_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial005_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial006_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial006b_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial007_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial008_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial009_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial011_py310.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/add_latest_release_date.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/deploy_docs_status.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/docs.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/format.sh +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/generate_select.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/lint.sh +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/prepare_release.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/test.sh +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/default.py +0 -0
- {sqlmodel-0.0.44/sqlmodel/ext/asyncio → sqlmodel-0.0.45/sqlmodel/ext}/__init__.py +0 -0
- {sqlmodel-0.0.44/sqlmodel/orm → sqlmodel-0.0.45/sqlmodel/ext/asyncio}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/ext/asyncio/session.py +0 -0
- {sqlmodel-0.0.44/sqlmodel/sql → sqlmodel-0.0.45/sqlmodel/orm}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/orm/session.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/pool/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/py.typed +0 -0
- {sqlmodel-0.0.44/tests → sqlmodel-0.0.45/sqlmodel/sql}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/sql/_expression_select_cls.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/sql/_expression_select_gen.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/sql/_expression_select_gen.py.jinja2 +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/sql/base.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/sql/expression.py +0 -0
- {sqlmodel-0.0.44/tests/test_advanced → sqlmodel-0.0.45/tests}/__init__.py +0 -0
- {sqlmodel-0.0.44/tests/test_advanced/test_decimal → sqlmodel-0.0.45/tests/test_advanced}/__init__.py +0 -0
- {sqlmodel-0.0.44/tests/test_advanced/test_uuid → sqlmodel-0.0.45/tests/test_advanced/test_datetime}/__init__.py +0 -0
- {sqlmodel-0.0.44/tests/test_pydantic → sqlmodel-0.0.45/tests/test_advanced/test_decimal}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_advanced/test_decimal/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial → sqlmodel-0.0.45/tests/test_advanced/test_uuid}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_advanced/test_uuid/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_advanced/test_uuid/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_aliases.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_annotated_uuid.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_dataclass_transform.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_default.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_deprecations.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_enums.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_enums_models.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_field_sa_args_kwargs.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_field_sa_column.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_field_sa_relationship.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_field_sa_type.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_fields_set.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_future_annotations.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_instance_no_args.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_main.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_missing_type.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_nullable.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_ondelete_raises.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_prepare_release.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_automatic_id_none_refresh → sqlmodel-0.0.45/tests/test_pydantic}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_pydantic/test_field.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_pydantic/test_model_dump.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_query.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_select_gen.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_select_typing.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_sqlalchemy_type_errors.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_code_structure → sqlmodel-0.0.45/tests/test_tutorial}/__init__.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_connect → sqlmodel-0.0.45/tests/test_tutorial/test_automatic_id_none_refresh}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_automatic_id_none_refresh/test_tutorial001_tutorial002.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_connect/test_create_connected_tables → sqlmodel-0.0.45/tests/test_tutorial/test_code_structure}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_code_structure/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_code_structure/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_connect/test_delete → sqlmodel-0.0.45/tests/test_tutorial/test_connect}/__init__.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_connect/test_insert → sqlmodel-0.0.45/tests/test_tutorial/test_connect/test_create_connected_tables}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_create_connected_tables/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_connect/test_select → sqlmodel-0.0.45/tests/test_tutorial/test_connect/test_delete}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_delete/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_connect/test_update → sqlmodel-0.0.45/tests/test_tutorial/test_connect/test_insert}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_insert/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_create_db_and_table → sqlmodel-0.0.45/tests/test_tutorial/test_connect/test_select}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_select/test_tutorial001_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_select/test_tutorial003.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_select/test_tutorial004.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_select/test_tutorial005.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_delete → sqlmodel-0.0.45/tests/test_tutorial/test_connect/test_update}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_update/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi → sqlmodel-0.0.45/tests/test_tutorial/test_create_db_and_table}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_create_db_and_table/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_create_db_and_table/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_create_db_and_table/test_tutorial003.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_app_testing → sqlmodel-0.0.45/tests/test_tutorial/test_delete}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_delete/test_tutorial001_tutorial002.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_delete → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi}/__init__.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_limit_and_offset → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_app_testing}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests003.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests004.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests005.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests006.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests_main.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_multiple_models → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_delete}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_delete/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_read_one → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_limit_and_offset}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_limit_and_offset/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_relationships → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_multiple_models}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_response_model → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_read_one}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_read_one/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_session_with_dependency → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_relationships}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_relationships/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_simple_hero_api → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_response_model}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_response_model/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_teams → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_session_with_dependency}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_session_with_dependency/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_update → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_simple_hero_api}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_simple_hero_api/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_indexes → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_teams}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_teams/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_insert → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_update}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_update/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_update/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_limit_and_offset → sqlmodel-0.0.45/tests/test_tutorial/test_indexes}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_indexes/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_indexes/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_many_to_many → sqlmodel-0.0.45/tests/test_tutorial/test_insert}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_insert/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_insert/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_insert/test_tutorial003.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_one → sqlmodel-0.0.45/tests/test_tutorial/test_limit_and_offset}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_limit_and_offset/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_limit_and_offset/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_limit_and_offset/test_tutorial003.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_limit_and_offset/test_tutorial004.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_relationship_attributes → sqlmodel-0.0.45/tests/test_tutorial/test_many_to_many}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_many_to_many/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_many_to_many/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_many_to_many/test_tutorial003.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_relationship_attributes/test_back_populates → sqlmodel-0.0.45/tests/test_tutorial/test_one}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial003.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial004.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial005.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial006.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial007.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial008.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial009.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_relationship_attributes/test_create_and_update_relationships → sqlmodel-0.0.45/tests/test_tutorial/test_relationship_attributes}/__init__.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_relationship_attributes/test_define_relationship_attributes → sqlmodel-0.0.45/tests/test_tutorial/test_relationship_attributes/test_back_populates}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial003.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship → sqlmodel-0.0.45/tests/test_tutorial/test_relationship_attributes/test_create_and_update_relationships}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_create_and_update_relationships/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_relationship_attributes/test_read_relationships → sqlmodel-0.0.45/tests/test_tutorial/test_relationship_attributes/test_define_relationship_attributes}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_define_relationship_attributes/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_select → sqlmodel-0.0.45/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial003.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial004.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial005.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_update → sqlmodel-0.0.45/tests/test_tutorial/test_relationship_attributes/test_read_relationships}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_read_relationships/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_read_relationships/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44/tests/test_tutorial/test_where → sqlmodel-0.0.45/tests/test_tutorial/test_select}/__init__.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_select/test_tutorial001_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_select/test_tutorial003_tutorial004.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_update/test_tutorial001_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_update/test_tutorial003_tutorial004.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial001.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial002.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial003.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial004.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial005.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial006.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial006b.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial007.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial008.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial009.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial011.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_update.py +0 -0
- {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_validation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqlmodel
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.45
|
|
4
4
|
Summary: SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness.
|
|
5
5
|
Author-Email: =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= <tiangolo@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from datetime import datetime, timezone
|
|
2
|
+
|
|
3
|
+
from sqlmodel import Field, Session, SQLModel, create_engine
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Event(SQLModel, table=True):
|
|
7
|
+
id: int | None = Field(default=None, primary_key=True)
|
|
8
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
sqlite_file_name = "database.db"
|
|
12
|
+
sqlite_url = f"sqlite:///{sqlite_file_name}"
|
|
13
|
+
|
|
14
|
+
engine = create_engine(sqlite_url, echo=True)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def main():
|
|
18
|
+
event = Event()
|
|
19
|
+
print("Event:", event)
|
|
20
|
+
|
|
21
|
+
SQLModel.metadata.create_all(engine)
|
|
22
|
+
with Session(engine) as session:
|
|
23
|
+
session.add(event)
|
|
24
|
+
session.commit()
|
|
25
|
+
session.refresh(event)
|
|
26
|
+
print("Event from database:", event)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
if __name__ == "__main__":
|
|
30
|
+
main()
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from datetime import UTC, datetime
|
|
2
|
+
|
|
3
|
+
from sqlmodel import Field, Session, SQLModel, create_engine
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Event(SQLModel, table=True):
|
|
7
|
+
id: int | None = Field(default=None, primary_key=True)
|
|
8
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
sqlite_file_name = "database.db"
|
|
12
|
+
sqlite_url = f"sqlite:///{sqlite_file_name}"
|
|
13
|
+
|
|
14
|
+
engine = create_engine(sqlite_url, echo=True)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def main():
|
|
18
|
+
event = Event()
|
|
19
|
+
print("Event:", event)
|
|
20
|
+
|
|
21
|
+
SQLModel.metadata.create_all(engine)
|
|
22
|
+
with Session(engine) as session:
|
|
23
|
+
session.add(event)
|
|
24
|
+
session.commit()
|
|
25
|
+
session.refresh(event)
|
|
26
|
+
print("Event from database:", event)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
if __name__ == "__main__":
|
|
30
|
+
main()
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from pydantic import AwareDatetime, NaiveDatetime
|
|
2
|
+
from sqlmodel import Field, SQLModel
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class Event(SQLModel, table=True):
|
|
6
|
+
id: int | None = Field(default=None, primary_key=True)
|
|
7
|
+
starts_at: AwareDatetime
|
|
8
|
+
local_time: NaiveDatetime
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def main():
|
|
12
|
+
data = {
|
|
13
|
+
"starts_at": "2026-01-01T12:00:00Z",
|
|
14
|
+
"local_time": "2026-01-01T12:00:00",
|
|
15
|
+
}
|
|
16
|
+
event = Event.model_validate(data)
|
|
17
|
+
print("Event:", event)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
if __name__ == "__main__":
|
|
21
|
+
main()
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import DateTime
|
|
4
|
+
from sqlmodel import Field, SQLModel
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Event(SQLModel, table=True):
|
|
8
|
+
id: int | None = Field(default=None, primary_key=True)
|
|
9
|
+
created_at: datetime = Field(sa_type=DateTime(timezone=False))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def main():
|
|
13
|
+
event = Event(created_at=datetime(2026, 1, 1, 12))
|
|
14
|
+
print("Event:", event)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if __name__ == "__main__":
|
|
18
|
+
main()
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import sqlalchemy as sa
|
|
2
|
+
from alembic import op
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def upgrade():
|
|
6
|
+
op.alter_column(
|
|
7
|
+
"event",
|
|
8
|
+
"created_at",
|
|
9
|
+
existing_type=sa.DateTime(timezone=False),
|
|
10
|
+
type_=sa.DateTime(timezone=True),
|
|
11
|
+
postgresql_using="created_at AT TIME ZONE 'UTC'",
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def downgrade():
|
|
16
|
+
op.alter_column(
|
|
17
|
+
"event",
|
|
18
|
+
"created_at",
|
|
19
|
+
existing_type=sa.DateTime(timezone=True),
|
|
20
|
+
type_=sa.DateTime(timezone=False),
|
|
21
|
+
postgresql_using="created_at AT TIME ZONE 'UTC'",
|
|
22
|
+
)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
from pydantic import NaiveDatetime
|
|
4
|
+
from sqlmodel import Field, SQLModel
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Event(SQLModel, table=True):
|
|
8
|
+
id: int | None = Field(default=None, primary_key=True)
|
|
9
|
+
created_at: NaiveDatetime
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def main():
|
|
13
|
+
event = Event.model_validate({"created_at": datetime(2026, 1, 1, 12)})
|
|
14
|
+
print("Event:", event)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if __name__ == "__main__":
|
|
18
|
+
main()
|
|
@@ -41,7 +41,7 @@ dependencies = [
|
|
|
41
41
|
"pydantic>=2.11.0",
|
|
42
42
|
"typing-extensions>=4.5.0",
|
|
43
43
|
]
|
|
44
|
-
version = "0.0.
|
|
44
|
+
version = "0.0.45"
|
|
45
45
|
|
|
46
46
|
[project.urls]
|
|
47
47
|
Homepage = "https://github.com/fastapi/sqlmodel"
|
|
@@ -78,6 +78,7 @@ github-actions = [
|
|
|
78
78
|
"smokeshow >=0.5.0",
|
|
79
79
|
]
|
|
80
80
|
tests = [
|
|
81
|
+
"alembic >=1.12.0",
|
|
81
82
|
"black >=24.1.0",
|
|
82
83
|
"coverage[toml] >=6.2",
|
|
83
84
|
"dirty-equals >=0.11",
|
|
@@ -36,6 +36,33 @@ id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
|
|
|
36
36
|
|
|
37
37
|
Use non-table `SQLModel` classes for create/update/public API schemas instead of mixing request/response-only fields into table models.
|
|
38
38
|
|
|
39
|
+
## Datetimes
|
|
40
|
+
|
|
41
|
+
In SQLModel `0.0.45` and newer, use `datetime` for timestamp fields. SQLModel automatically selects `UTCDateTime`, which normalizes aware values to UTC when writing and returns aware UTC datetimes when reading, including with SQLite and MySQL/MariaDB.
|
|
42
|
+
|
|
43
|
+
Do not add `sa_type=DateTime(timezone=True)` or `sa_column=Column(DateTime(timezone=True))` just to enable timezone support. These overrides bypass SQLModel's UTC processing. If an explicit column type is needed, import `UTCDateTime` from `sqlmodel`.
|
|
44
|
+
|
|
45
|
+
For generated timestamps on Python 3.11 and newer:
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
from datetime import UTC, datetime
|
|
49
|
+
|
|
50
|
+
from sqlmodel import Field, SQLModel
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class Event(SQLModel, table=True):
|
|
54
|
+
id: int | None = Field(default=None, primary_key=True)
|
|
55
|
+
created_at: datetime = Field(default_factory=lambda: datetime.now(UTC))
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
On Python 3.10, import `timezone` instead of `UTC` and use `lambda: datetime.now(timezone.utc)`.
|
|
59
|
+
|
|
60
|
+
- Supply aware datetimes for writes, updates, and query filters. Avoid `datetime.now()` without a timezone and `datetime.utcnow()` for UTC timestamps. Naive database parameters are rejected when the statement executes.
|
|
61
|
+
- Use Pydantic's `AwareDatetime` when input validation must reject naive values. It uses the same UTC storage. Validate table-model input with `Model.model_validate(data)`. Direct table-model construction currently skips Pydantic validation, and plain `datetime` validation accepts naive values.
|
|
62
|
+
- Use Pydantic's `NaiveDatetime` for intentional naive storage. It selects `DateTime(timezone=False)` and requires naive values during Pydantic validation.
|
|
63
|
+
|
|
64
|
+
When upgrading existing applications, follow the [datetime migration guide](https://sqlmodel.tiangolo.com/advanced/datetime/#upgrade-existing-applications). Changing the model does not alter existing columns or convert historical data.
|
|
65
|
+
|
|
39
66
|
## Sessions and Queries
|
|
40
67
|
|
|
41
68
|
Open sessions directly with the engine:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
__version__ = "0.0.
|
|
1
|
+
__version__ = "0.0.45"
|
|
2
2
|
|
|
3
3
|
# Re-export from Pydantic
|
|
4
4
|
from pydantic import Discriminator as Discriminator
|
|
@@ -145,3 +145,4 @@ from .sql.expression import tuple_ as tuple_
|
|
|
145
145
|
from .sql.expression import type_coerce as type_coerce
|
|
146
146
|
from .sql.expression import within_group as within_group
|
|
147
147
|
from .sql.sqltypes import AutoString as AutoString
|
|
148
|
+
from .sql.sqltypes import UTCDateTime as UTCDateTime
|
|
@@ -12,13 +12,14 @@ from typing import (
|
|
|
12
12
|
TypeAlias,
|
|
13
13
|
TypeVar,
|
|
14
14
|
Union,
|
|
15
|
+
cast,
|
|
15
16
|
get_args,
|
|
16
17
|
get_origin,
|
|
17
18
|
)
|
|
18
19
|
|
|
19
20
|
from annotated_types import MaxLen
|
|
20
21
|
from pydantic import VERSION as P_VERSION
|
|
21
|
-
from pydantic import BaseModel
|
|
22
|
+
from pydantic import AwareDatetime, BaseModel, NaiveDatetime
|
|
22
23
|
from pydantic import ConfigDict as ConfigDict
|
|
23
24
|
from pydantic._internal._fields import PydanticMetadata
|
|
24
25
|
from pydantic._internal._model_construction import ModelMetaclass as ModelMetaclass
|
|
@@ -179,7 +180,15 @@ def get_sa_type_from_type_annotation(annotation: Any) -> Any:
|
|
|
179
180
|
if origin is None:
|
|
180
181
|
return annotation
|
|
181
182
|
elif origin is Annotated:
|
|
182
|
-
|
|
183
|
+
type_, *metadata = get_args(annotation)
|
|
184
|
+
type_ = get_sa_type_from_type_annotation(type_)
|
|
185
|
+
# Like Pydantic, apply the last timezone constraint in Annotated.
|
|
186
|
+
for meta in metadata:
|
|
187
|
+
if meta is AwareDatetime or isinstance(meta, cast(type, AwareDatetime)):
|
|
188
|
+
type_ = AwareDatetime
|
|
189
|
+
elif meta is NaiveDatetime or isinstance(meta, cast(type, NaiveDatetime)):
|
|
190
|
+
type_ = NaiveDatetime
|
|
191
|
+
return type_
|
|
183
192
|
if _is_union_type(origin):
|
|
184
193
|
bases = get_args(annotation)
|
|
185
194
|
if len(bases) > 2:
|
|
@@ -194,7 +203,7 @@ def get_sa_type_from_type_annotation(annotation: Any) -> Any:
|
|
|
194
203
|
|
|
195
204
|
|
|
196
205
|
def get_sa_type_from_field(field: Any) -> Any:
|
|
197
|
-
type_: Any = field.
|
|
206
|
+
type_: Any = field.rebuild_annotation()
|
|
198
207
|
return get_sa_type_from_type_annotation(type_)
|
|
199
208
|
|
|
200
209
|
|
|
@@ -24,7 +24,7 @@ from typing import (
|
|
|
24
24
|
overload,
|
|
25
25
|
)
|
|
26
26
|
|
|
27
|
-
from pydantic import BaseModel, Discriminator, EmailStr
|
|
27
|
+
from pydantic import AwareDatetime, BaseModel, Discriminator, EmailStr, NaiveDatetime
|
|
28
28
|
from pydantic.fields import FieldInfo as PydanticFieldInfo
|
|
29
29
|
from sqlalchemy import (
|
|
30
30
|
Boolean,
|
|
@@ -74,7 +74,7 @@ from ._compat import (
|
|
|
74
74
|
sqlmodel_init,
|
|
75
75
|
sqlmodel_validate,
|
|
76
76
|
)
|
|
77
|
-
from .sql.sqltypes import AutoString
|
|
77
|
+
from .sql.sqltypes import AutoString, UTCDateTime
|
|
78
78
|
|
|
79
79
|
if TYPE_CHECKING:
|
|
80
80
|
from pydantic._internal._model_construction import ModelMetaclass as ModelMetaclass
|
|
@@ -754,8 +754,10 @@ def get_sqlalchemy_type(field: Any) -> Any:
|
|
|
754
754
|
return Boolean
|
|
755
755
|
if issubclass(type_, int):
|
|
756
756
|
return Integer
|
|
757
|
-
if issubclass(type_, datetime):
|
|
758
|
-
|
|
757
|
+
if issubclass(type_, (datetime, AwareDatetime, NaiveDatetime)):
|
|
758
|
+
if issubclass(type_, cast(type, NaiveDatetime)):
|
|
759
|
+
return DateTime(timezone=False)
|
|
760
|
+
return UTCDateTime()
|
|
759
761
|
if issubclass(type_, date):
|
|
760
762
|
return Date
|
|
761
763
|
if issubclass(type_, timedelta):
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from datetime import datetime, timezone
|
|
2
|
+
from typing import Any, cast
|
|
3
|
+
|
|
4
|
+
from sqlalchemy import types
|
|
5
|
+
from sqlalchemy.engine.interfaces import Dialect
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class UTCDateTime(types.TypeDecorator[datetime]):
|
|
9
|
+
"""Store aware datetimes and return them in UTC."""
|
|
10
|
+
|
|
11
|
+
impl = types.DateTime
|
|
12
|
+
cache_ok = True
|
|
13
|
+
|
|
14
|
+
def __init__(self) -> None:
|
|
15
|
+
super().__init__(timezone=True)
|
|
16
|
+
|
|
17
|
+
def __repr__(self) -> str:
|
|
18
|
+
return "UTCDateTime()"
|
|
19
|
+
|
|
20
|
+
def process_bind_param(
|
|
21
|
+
self, value: datetime | None, dialect: Dialect
|
|
22
|
+
) -> datetime | None:
|
|
23
|
+
if value is None:
|
|
24
|
+
return None
|
|
25
|
+
if value.utcoffset() is None:
|
|
26
|
+
raise ValueError(
|
|
27
|
+
"Datetime values must have timezone information. "
|
|
28
|
+
"Use datetime.now(timezone.utc), or annotate the field with "
|
|
29
|
+
"NaiveDatetime for naive storage."
|
|
30
|
+
)
|
|
31
|
+
return value.astimezone(timezone.utc)
|
|
32
|
+
|
|
33
|
+
def process_result_value(
|
|
34
|
+
self, value: datetime | None, dialect: Dialect
|
|
35
|
+
) -> datetime | None:
|
|
36
|
+
if value is None:
|
|
37
|
+
return None
|
|
38
|
+
if value.utcoffset() is None:
|
|
39
|
+
# Databases without timezone support store UTC without an offset.
|
|
40
|
+
return value.replace(tzinfo=timezone.utc)
|
|
41
|
+
return value.astimezone(timezone.utc)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class AutoString(types.TypeDecorator):
|
|
45
|
+
impl = types.String
|
|
46
|
+
cache_ok = True
|
|
47
|
+
mysql_default_length = 255
|
|
48
|
+
|
|
49
|
+
def load_dialect_impl(self, dialect: Dialect) -> "types.TypeEngine[Any]":
|
|
50
|
+
impl = cast(types.String, self.impl)
|
|
51
|
+
if impl.length is None and dialect.name == "mysql":
|
|
52
|
+
return dialect.type_descriptor(types.String(self.mysql_default_length))
|
|
53
|
+
return super().load_dialect_impl(dialect)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import shutil
|
|
2
2
|
import subprocess
|
|
3
|
+
import sys
|
|
3
4
|
from collections.abc import Callable, Generator
|
|
4
5
|
from dataclasses import dataclass, field
|
|
5
6
|
from pathlib import Path
|
|
@@ -83,3 +84,8 @@ def print_mock_fixture() -> Generator[PrintMock, None, None]:
|
|
|
83
84
|
new_print = get_testing_print_function(print_mock.calls)
|
|
84
85
|
with patch("builtins.print", new=new_print):
|
|
85
86
|
yield print_mock
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
needs_py311 = pytest.mark.skipif(
|
|
90
|
+
sys.version_info < (3, 11), reason="requires Python 3.11+"
|
|
91
|
+
)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
from datetime import datetime, timezone
|
|
3
|
+
from types import ModuleType
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
from sqlmodel import SQLModel, create_engine
|
|
7
|
+
|
|
8
|
+
from ...conftest import PrintMock, needs_py311
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@pytest.fixture(
|
|
12
|
+
name="mod",
|
|
13
|
+
params=[
|
|
14
|
+
pytest.param("tutorial001_py310"),
|
|
15
|
+
pytest.param("tutorial001_py311", marks=needs_py311),
|
|
16
|
+
],
|
|
17
|
+
)
|
|
18
|
+
def get_module(request: pytest.FixtureRequest) -> ModuleType:
|
|
19
|
+
mod = importlib.import_module(f"docs_src.advanced.datetime.{request.param}")
|
|
20
|
+
mod.sqlite_url = "sqlite://"
|
|
21
|
+
mod.engine = create_engine(mod.sqlite_url)
|
|
22
|
+
return mod
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_tutorial(print_mock: PrintMock, mod: ModuleType) -> None:
|
|
26
|
+
before = datetime.now(timezone.utc)
|
|
27
|
+
mod.main()
|
|
28
|
+
after = datetime.now(timezone.utc)
|
|
29
|
+
|
|
30
|
+
created_at = print_mock.calls[0][1]["created_at"]
|
|
31
|
+
assert created_at.tzinfo is timezone.utc
|
|
32
|
+
assert before <= created_at <= after
|
|
33
|
+
assert print_mock.calls == [
|
|
34
|
+
["Event:", {"id": None, "created_at": created_at}],
|
|
35
|
+
["Event from database:", {"id": 1, "created_at": created_at}],
|
|
36
|
+
]
|
|
37
|
+
assert print_mock.calls[1][1]["created_at"].tzinfo is timezone.utc
|
|
38
|
+
|
|
39
|
+
table = SQLModel.metadata.tables["event"]
|
|
40
|
+
assert table.c.created_at.type.timezone is True
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
from datetime import datetime, timezone
|
|
3
|
+
from types import ModuleType
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
from pydantic import ValidationError
|
|
7
|
+
from sqlmodel import SQLModel
|
|
8
|
+
|
|
9
|
+
from ...conftest import PrintMock
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@pytest.fixture(
|
|
13
|
+
name="mod",
|
|
14
|
+
params=[
|
|
15
|
+
pytest.param("tutorial002_py310"),
|
|
16
|
+
],
|
|
17
|
+
)
|
|
18
|
+
def get_module(request: pytest.FixtureRequest) -> ModuleType:
|
|
19
|
+
return importlib.import_module(f"docs_src.advanced.datetime.{request.param}")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_tutorial(print_mock: PrintMock, mod: ModuleType) -> None:
|
|
23
|
+
mod.main()
|
|
24
|
+
assert print_mock.calls == [
|
|
25
|
+
[
|
|
26
|
+
"Event:",
|
|
27
|
+
{
|
|
28
|
+
"id": None,
|
|
29
|
+
"starts_at": datetime(2026, 1, 1, 12, tzinfo=timezone.utc),
|
|
30
|
+
"local_time": datetime(2026, 1, 1, 12),
|
|
31
|
+
},
|
|
32
|
+
]
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
with pytest.raises(ValidationError) as exc_info:
|
|
36
|
+
mod.Event.model_validate(
|
|
37
|
+
{
|
|
38
|
+
"starts_at": "2026-01-01T12:00:00",
|
|
39
|
+
"local_time": "2026-01-01T12:00:00Z",
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
errors = exc_info.value.errors()
|
|
43
|
+
assert [(error["loc"], error["type"]) for error in errors] == [
|
|
44
|
+
(("starts_at",), "timezone_aware"),
|
|
45
|
+
(("local_time",), "timezone_naive"),
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
table = SQLModel.metadata.tables["event"]
|
|
49
|
+
assert table.c.starts_at.type.timezone is True
|
|
50
|
+
assert table.c.local_time.type.timezone is False
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
from datetime import datetime, timezone
|
|
3
|
+
from types import ModuleType
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
from sqlmodel import SQLModel
|
|
7
|
+
|
|
8
|
+
from ...conftest import PrintMock
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@pytest.fixture(
|
|
12
|
+
name="mod",
|
|
13
|
+
params=[
|
|
14
|
+
pytest.param("tutorial003_py310"),
|
|
15
|
+
],
|
|
16
|
+
)
|
|
17
|
+
def get_module(request: pytest.FixtureRequest) -> ModuleType:
|
|
18
|
+
return importlib.import_module(f"docs_src.advanced.datetime.{request.param}")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_tutorial(print_mock: PrintMock, mod: ModuleType) -> None:
|
|
22
|
+
mod.main()
|
|
23
|
+
assert print_mock.calls == [
|
|
24
|
+
["Event:", {"id": None, "created_at": datetime(2026, 1, 1, 12)}]
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
aware = datetime(2026, 1, 1, 12, tzinfo=timezone.utc)
|
|
28
|
+
assert mod.Event.model_validate({"created_at": aware}).created_at == aware
|
|
29
|
+
|
|
30
|
+
table = SQLModel.metadata.tables["event"]
|
|
31
|
+
assert table.c.created_at.type.timezone is False
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
from io import StringIO
|
|
3
|
+
from types import ModuleType
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
from alembic.migration import MigrationContext
|
|
7
|
+
from alembic.operations import Operations
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@pytest.fixture(
|
|
11
|
+
name="mod",
|
|
12
|
+
params=[
|
|
13
|
+
pytest.param("tutorial004_py310"),
|
|
14
|
+
],
|
|
15
|
+
)
|
|
16
|
+
def get_module(request: pytest.FixtureRequest) -> ModuleType:
|
|
17
|
+
return importlib.import_module(f"docs_src.advanced.datetime.{request.param}")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_tutorial(mod: ModuleType) -> None:
|
|
21
|
+
output = StringIO()
|
|
22
|
+
context = MigrationContext.configure(
|
|
23
|
+
dialect_name="postgresql",
|
|
24
|
+
opts={"as_sql": True, "output_buffer": output},
|
|
25
|
+
)
|
|
26
|
+
with Operations.context(context):
|
|
27
|
+
mod.upgrade()
|
|
28
|
+
mod.downgrade()
|
|
29
|
+
|
|
30
|
+
assert output.getvalue() == (
|
|
31
|
+
"ALTER TABLE event ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE "
|
|
32
|
+
"USING created_at AT TIME ZONE 'UTC';\n\n"
|
|
33
|
+
"ALTER TABLE event ALTER COLUMN created_at TYPE TIMESTAMP WITHOUT TIME ZONE "
|
|
34
|
+
"USING created_at AT TIME ZONE 'UTC';\n\n"
|
|
35
|
+
)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
from datetime import datetime, timezone
|
|
3
|
+
from types import ModuleType
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
from pydantic import ValidationError
|
|
7
|
+
from sqlmodel import SQLModel
|
|
8
|
+
|
|
9
|
+
from ...conftest import PrintMock
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@pytest.fixture(
|
|
13
|
+
name="mod",
|
|
14
|
+
params=[
|
|
15
|
+
pytest.param("tutorial005_py310"),
|
|
16
|
+
],
|
|
17
|
+
)
|
|
18
|
+
def get_module(request: pytest.FixtureRequest) -> ModuleType:
|
|
19
|
+
return importlib.import_module(f"docs_src.advanced.datetime.{request.param}")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_tutorial(print_mock: PrintMock, mod: ModuleType) -> None:
|
|
23
|
+
mod.main()
|
|
24
|
+
assert print_mock.calls == [
|
|
25
|
+
["Event:", {"id": None, "created_at": datetime(2026, 1, 1, 12)}]
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
with pytest.raises(ValidationError) as exc_info:
|
|
29
|
+
mod.Event.model_validate(
|
|
30
|
+
{"created_at": datetime(2026, 1, 1, 12, tzinfo=timezone.utc)}
|
|
31
|
+
)
|
|
32
|
+
errors = exc_info.value.errors()
|
|
33
|
+
assert [(error["loc"], error["type"]) for error in errors] == [
|
|
34
|
+
(("created_at",), "timezone_naive"),
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
table = SQLModel.metadata.tables["event"]
|
|
38
|
+
assert table.c.created_at.type.timezone is False
|