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.
Files changed (357) hide show
  1. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/PKG-INFO +1 -1
  2. sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial001_py310.py +30 -0
  3. sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial001_py311.py +30 -0
  4. sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial002_py310.py +21 -0
  5. sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial003_py310.py +18 -0
  6. sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial004_py310.py +22 -0
  7. sqlmodel-0.0.45/docs_src/advanced/datetime/tutorial005_py310.py +18 -0
  8. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/pyproject.toml +2 -1
  9. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/.agents/skills/sqlmodel/SKILL.md +27 -0
  10. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/__init__.py +2 -1
  11. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/_compat.py +12 -3
  12. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/main.py +6 -4
  13. sqlmodel-0.0.45/sqlmodel/sql/sqltypes.py +53 -0
  14. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/conftest.py +6 -0
  15. sqlmodel-0.0.45/tests/test_advanced/test_datetime/test_tutorial001.py +40 -0
  16. sqlmodel-0.0.45/tests/test_advanced/test_datetime/test_tutorial002.py +50 -0
  17. sqlmodel-0.0.45/tests/test_advanced/test_datetime/test_tutorial003.py +31 -0
  18. sqlmodel-0.0.45/tests/test_advanced/test_datetime/test_tutorial004.py +35 -0
  19. sqlmodel-0.0.45/tests/test_advanced/test_datetime/test_tutorial005.py +38 -0
  20. sqlmodel-0.0.45/tests/test_datetime.py +314 -0
  21. sqlmodel-0.0.45/tests/test_tutorial/test_update/__init__.py +0 -0
  22. sqlmodel-0.0.45/tests/test_tutorial/test_where/__init__.py +0 -0
  23. sqlmodel-0.0.44/sqlmodel/sql/sqltypes.py +0 -16
  24. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/LICENSE +0 -0
  25. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/README.md +0 -0
  26. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/__init__.py +0 -0
  27. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/advanced/__init__.py +0 -0
  28. {sqlmodel-0.0.44/docs_src/advanced/decimal → sqlmodel-0.0.45/docs_src/advanced/datetime}/__init__.py +0 -0
  29. {sqlmodel-0.0.44/docs_src/advanced/uuid → sqlmodel-0.0.45/docs_src/advanced/decimal}/__init__.py +0 -0
  30. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/advanced/decimal/tutorial001_py310.py +0 -0
  31. {sqlmodel-0.0.44/docs_src/tutorial → sqlmodel-0.0.45/docs_src/advanced/uuid}/__init__.py +0 -0
  32. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/advanced/uuid/tutorial001_py310.py +0 -0
  33. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/advanced/uuid/tutorial002_py310.py +0 -0
  34. {sqlmodel-0.0.44/docs_src/tutorial/automatic_id_none_refresh → sqlmodel-0.0.45/docs_src/tutorial}/__init__.py +0 -0
  35. {sqlmodel-0.0.44/docs_src/tutorial/code_structure → sqlmodel-0.0.45/docs_src/tutorial/automatic_id_none_refresh}/__init__.py +0 -0
  36. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/automatic_id_none_refresh/annotations/en/tutorial002.md +0 -0
  37. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/automatic_id_none_refresh/tutorial001_py310.py +0 -0
  38. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/automatic_id_none_refresh/tutorial002_py310.py +0 -0
  39. {sqlmodel-0.0.44/docs_src/tutorial/code_structure/tutorial001_py310 → sqlmodel-0.0.45/docs_src/tutorial/code_structure}/__init__.py +0 -0
  40. {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
  41. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial001_py310/app.py +0 -0
  42. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial001_py310/database.py +0 -0
  43. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial001_py310/models.py +0 -0
  44. {sqlmodel-0.0.44/docs_src/tutorial/connect → sqlmodel-0.0.45/docs_src/tutorial/code_structure/tutorial002_py310}/__init__.py +0 -0
  45. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial002_py310/app.py +0 -0
  46. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial002_py310/database.py +0 -0
  47. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial002_py310/hero_model.py +0 -0
  48. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/code_structure/tutorial002_py310/team_model.py +0 -0
  49. {sqlmodel-0.0.44/docs_src/tutorial/connect/create_tables → sqlmodel-0.0.45/docs_src/tutorial/connect}/__init__.py +0 -0
  50. {sqlmodel-0.0.44/docs_src/tutorial/connect/delete → sqlmodel-0.0.45/docs_src/tutorial/connect/create_tables}/__init__.py +0 -0
  51. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/create_tables/tutorial001_py310.py +0 -0
  52. {sqlmodel-0.0.44/docs_src/tutorial/connect/insert → sqlmodel-0.0.45/docs_src/tutorial/connect/delete}/__init__.py +0 -0
  53. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/delete/tutorial001_py310.py +0 -0
  54. {sqlmodel-0.0.44/docs_src/tutorial/connect/select → sqlmodel-0.0.45/docs_src/tutorial/connect/insert}/__init__.py +0 -0
  55. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/insert/tutorial001_py310.py +0 -0
  56. {sqlmodel-0.0.44/docs_src/tutorial/connect/update → sqlmodel-0.0.45/docs_src/tutorial/connect/select}/__init__.py +0 -0
  57. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/select/tutorial001_py310.py +0 -0
  58. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/select/tutorial002_py310.py +0 -0
  59. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/select/tutorial003_py310.py +0 -0
  60. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/select/tutorial004_py310.py +0 -0
  61. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/select/tutorial005_py310.py +0 -0
  62. {sqlmodel-0.0.44/docs_src/tutorial/create_db_and_table → sqlmodel-0.0.45/docs_src/tutorial/connect/update}/__init__.py +0 -0
  63. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/connect/update/tutorial001_py310.py +0 -0
  64. {sqlmodel-0.0.44/docs_src/tutorial/delete → sqlmodel-0.0.45/docs_src/tutorial/create_db_and_table}/__init__.py +0 -0
  65. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/create_db_and_table/annotations/en/tutorial003.md +0 -0
  66. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/create_db_and_table/tutorial001_py310.py +0 -0
  67. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/create_db_and_table/tutorial002_py310.py +0 -0
  68. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/create_db_and_table/tutorial003_py310.py +0 -0
  69. {sqlmodel-0.0.44/docs_src/tutorial/fastapi → sqlmodel-0.0.45/docs_src/tutorial/delete}/__init__.py +0 -0
  70. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/delete/annotations/en/tutorial002.md +0 -0
  71. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/delete/tutorial001_py310.py +0 -0
  72. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/delete/tutorial002_py310.py +0 -0
  73. {sqlmodel-0.0.44/docs_src/tutorial/fastapi/app_testing → sqlmodel-0.0.45/docs_src/tutorial/fastapi}/__init__.py +0 -0
  74. {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
  75. {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
  76. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_001.md +0 -0
  77. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_002.md +0 -0
  78. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_003.md +0 -0
  79. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_004.md +0 -0
  80. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_005.md +0 -0
  81. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/annotations/en/test_main_006.md +0 -0
  82. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/main.py +0 -0
  83. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_extra_coverage.py +0 -0
  84. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main.py +0 -0
  85. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_001.py +0 -0
  86. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_002.py +0 -0
  87. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_003.py +0 -0
  88. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_004.py +0 -0
  89. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_005.py +0 -0
  90. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/app_testing/tutorial001_py310/test_main_006.py +0 -0
  91. {sqlmodel-0.0.44/docs_src/tutorial/fastapi/limit_and_offset → sqlmodel-0.0.45/docs_src/tutorial/fastapi/delete}/__init__.py +0 -0
  92. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/delete/tutorial001_py310.py +0 -0
  93. {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
  94. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/limit_and_offset/tutorial001_py310.py +0 -0
  95. {sqlmodel-0.0.44/docs_src/tutorial/fastapi/read_one → sqlmodel-0.0.45/docs_src/tutorial/fastapi/multiple_models}/__init__.py +0 -0
  96. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/multiple_models/tutorial001_py310.py +0 -0
  97. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/multiple_models/tutorial002_py310.py +0 -0
  98. {sqlmodel-0.0.44/docs_src/tutorial/fastapi/relationships → sqlmodel-0.0.45/docs_src/tutorial/fastapi/read_one}/__init__.py +0 -0
  99. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/read_one/tutorial001_py310.py +0 -0
  100. {sqlmodel-0.0.44/docs_src/tutorial/fastapi/response_model → sqlmodel-0.0.45/docs_src/tutorial/fastapi/relationships}/__init__.py +0 -0
  101. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/relationships/tutorial001_py310.py +0 -0
  102. {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
  103. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/response_model/tutorial001_py310.py +0 -0
  104. {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
  105. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/session_with_dependency/tutorial001_py310.py +0 -0
  106. {sqlmodel-0.0.44/docs_src/tutorial/fastapi/teams → sqlmodel-0.0.45/docs_src/tutorial/fastapi/simple_hero_api}/__init__.py +0 -0
  107. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/simple_hero_api/tutorial001_py310.py +0 -0
  108. {sqlmodel-0.0.44/docs_src/tutorial/fastapi/update → sqlmodel-0.0.45/docs_src/tutorial/fastapi/teams}/__init__.py +0 -0
  109. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/teams/tutorial001_py310.py +0 -0
  110. {sqlmodel-0.0.44/docs_src/tutorial/indexes → sqlmodel-0.0.45/docs_src/tutorial/fastapi/update}/__init__.py +0 -0
  111. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/update/tutorial001_py310.py +0 -0
  112. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/fastapi/update/tutorial002_py310.py +0 -0
  113. {sqlmodel-0.0.44/docs_src/tutorial/insert → sqlmodel-0.0.45/docs_src/tutorial/indexes}/__init__.py +0 -0
  114. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/indexes/tutorial001_py310.py +0 -0
  115. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/indexes/tutorial002_py310.py +0 -0
  116. {sqlmodel-0.0.44/docs_src/tutorial/many_to_many → sqlmodel-0.0.45/docs_src/tutorial/insert}/__init__.py +0 -0
  117. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/insert/annotations/en/tutorial003.md +0 -0
  118. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/insert/tutorial001_py310.py +0 -0
  119. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/insert/tutorial002_py310.py +0 -0
  120. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/insert/tutorial003_py310.py +0 -0
  121. {sqlmodel-0.0.44/docs_src/tutorial/offset_and_limit → sqlmodel-0.0.45/docs_src/tutorial/many_to_many}/__init__.py +0 -0
  122. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/many_to_many/tutorial001_py310.py +0 -0
  123. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/many_to_many/tutorial002_py310.py +0 -0
  124. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/many_to_many/tutorial003_py310.py +0 -0
  125. {sqlmodel-0.0.44/docs_src/tutorial/one → sqlmodel-0.0.45/docs_src/tutorial/offset_and_limit}/__init__.py +0 -0
  126. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/offset_and_limit/tutorial001_py310.py +0 -0
  127. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/offset_and_limit/tutorial002_py310.py +0 -0
  128. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/offset_and_limit/tutorial003_py310.py +0 -0
  129. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/offset_and_limit/tutorial004_py310.py +0 -0
  130. {sqlmodel-0.0.44/docs_src/tutorial/relationship_attributes → sqlmodel-0.0.45/docs_src/tutorial/one}/__init__.py +0 -0
  131. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial001_py310.py +0 -0
  132. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial002_py310.py +0 -0
  133. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial003_py310.py +0 -0
  134. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial004_py310.py +0 -0
  135. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial005_py310.py +0 -0
  136. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial006_py310.py +0 -0
  137. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial007_py310.py +0 -0
  138. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial008_py310.py +0 -0
  139. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/one/tutorial009_py310.py +0 -0
  140. {sqlmodel-0.0.44/docs_src/tutorial/relationship_attributes/back_populates → sqlmodel-0.0.45/docs_src/tutorial/relationship_attributes}/__init__.py +0 -0
  141. {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
  142. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/back_populates/tutorial001_py310.py +0 -0
  143. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/back_populates/tutorial002_py310.py +0 -0
  144. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/back_populates/tutorial003_py310.py +0 -0
  145. {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
  146. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial001_py310.py +0 -0
  147. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial002_py310.py +0 -0
  148. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial003_py310.py +0 -0
  149. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial004_py310.py +0 -0
  150. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/cascade_delete_relationships/tutorial005_py310.py +0 -0
  151. {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
  152. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/create_and_update_relationships/tutorial001_py310.py +0 -0
  153. {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
  154. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/define_relationship_attributes/tutorial001_py310.py +0 -0
  155. {sqlmodel-0.0.44/docs_src/tutorial/select → sqlmodel-0.0.45/docs_src/tutorial/relationship_attributes/read_relationships}/__init__.py +0 -0
  156. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/read_relationships/tutorial001_py310.py +0 -0
  157. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/relationship_attributes/read_relationships/tutorial002_py310.py +0 -0
  158. {sqlmodel-0.0.44/docs_src/tutorial/update → sqlmodel-0.0.45/docs_src/tutorial/select}/__init__.py +0 -0
  159. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/select/annotations/en/tutorial002.md +0 -0
  160. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/select/tutorial001_py310.py +0 -0
  161. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/select/tutorial002_py310.py +0 -0
  162. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/select/tutorial003_py310.py +0 -0
  163. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/select/tutorial004_py310.py +0 -0
  164. {sqlmodel-0.0.44/docs_src/tutorial/where → sqlmodel-0.0.45/docs_src/tutorial/update}/__init__.py +0 -0
  165. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/annotations/en/tutorial002.md +0 -0
  166. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/annotations/en/tutorial004.md +0 -0
  167. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/tutorial001_py310.py +0 -0
  168. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/tutorial002_py310.py +0 -0
  169. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/tutorial003_py310.py +0 -0
  170. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/update/tutorial004_py310.py +0 -0
  171. {sqlmodel-0.0.44/sqlmodel/ext → sqlmodel-0.0.45/docs_src/tutorial/where}/__init__.py +0 -0
  172. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial001_py310.py +0 -0
  173. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial002_py310.py +0 -0
  174. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial003_py310.py +0 -0
  175. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial004_py310.py +0 -0
  176. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial005_py310.py +0 -0
  177. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial006_py310.py +0 -0
  178. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial006b_py310.py +0 -0
  179. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial007_py310.py +0 -0
  180. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial008_py310.py +0 -0
  181. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial009_py310.py +0 -0
  182. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/docs_src/tutorial/where/tutorial011_py310.py +0 -0
  183. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/add_latest_release_date.py +0 -0
  184. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/deploy_docs_status.py +0 -0
  185. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/docs.py +0 -0
  186. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/format.sh +0 -0
  187. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/generate_select.py +0 -0
  188. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/lint.sh +0 -0
  189. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/prepare_release.py +0 -0
  190. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/scripts/test.sh +0 -0
  191. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/default.py +0 -0
  192. {sqlmodel-0.0.44/sqlmodel/ext/asyncio → sqlmodel-0.0.45/sqlmodel/ext}/__init__.py +0 -0
  193. {sqlmodel-0.0.44/sqlmodel/orm → sqlmodel-0.0.45/sqlmodel/ext/asyncio}/__init__.py +0 -0
  194. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/ext/asyncio/session.py +0 -0
  195. {sqlmodel-0.0.44/sqlmodel/sql → sqlmodel-0.0.45/sqlmodel/orm}/__init__.py +0 -0
  196. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/orm/session.py +0 -0
  197. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/pool/__init__.py +0 -0
  198. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/py.typed +0 -0
  199. {sqlmodel-0.0.44/tests → sqlmodel-0.0.45/sqlmodel/sql}/__init__.py +0 -0
  200. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/sql/_expression_select_cls.py +0 -0
  201. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/sql/_expression_select_gen.py +0 -0
  202. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/sql/_expression_select_gen.py.jinja2 +0 -0
  203. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/sql/base.py +0 -0
  204. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/sqlmodel/sql/expression.py +0 -0
  205. {sqlmodel-0.0.44/tests/test_advanced → sqlmodel-0.0.45/tests}/__init__.py +0 -0
  206. {sqlmodel-0.0.44/tests/test_advanced/test_decimal → sqlmodel-0.0.45/tests/test_advanced}/__init__.py +0 -0
  207. {sqlmodel-0.0.44/tests/test_advanced/test_uuid → sqlmodel-0.0.45/tests/test_advanced/test_datetime}/__init__.py +0 -0
  208. {sqlmodel-0.0.44/tests/test_pydantic → sqlmodel-0.0.45/tests/test_advanced/test_decimal}/__init__.py +0 -0
  209. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_advanced/test_decimal/test_tutorial001.py +0 -0
  210. {sqlmodel-0.0.44/tests/test_tutorial → sqlmodel-0.0.45/tests/test_advanced/test_uuid}/__init__.py +0 -0
  211. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_advanced/test_uuid/test_tutorial001.py +0 -0
  212. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_advanced/test_uuid/test_tutorial002.py +0 -0
  213. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_aliases.py +0 -0
  214. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_annotated_uuid.py +0 -0
  215. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_dataclass_transform.py +0 -0
  216. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_default.py +0 -0
  217. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_deprecations.py +0 -0
  218. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_enums.py +0 -0
  219. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_enums_models.py +0 -0
  220. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_field_sa_args_kwargs.py +0 -0
  221. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_field_sa_column.py +0 -0
  222. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_field_sa_relationship.py +0 -0
  223. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_field_sa_type.py +0 -0
  224. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_fields_set.py +0 -0
  225. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_future_annotations.py +0 -0
  226. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_instance_no_args.py +0 -0
  227. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_main.py +0 -0
  228. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_missing_type.py +0 -0
  229. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_nullable.py +0 -0
  230. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_ondelete_raises.py +0 -0
  231. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_prepare_release.py +0 -0
  232. {sqlmodel-0.0.44/tests/test_tutorial/test_automatic_id_none_refresh → sqlmodel-0.0.45/tests/test_pydantic}/__init__.py +0 -0
  233. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_pydantic/test_field.py +0 -0
  234. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_pydantic/test_model_dump.py +0 -0
  235. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_query.py +0 -0
  236. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_select_gen.py +0 -0
  237. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_select_typing.py +0 -0
  238. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_sqlalchemy_type_errors.py +0 -0
  239. {sqlmodel-0.0.44/tests/test_tutorial/test_code_structure → sqlmodel-0.0.45/tests/test_tutorial}/__init__.py +0 -0
  240. {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
  241. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_automatic_id_none_refresh/test_tutorial001_tutorial002.py +0 -0
  242. {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
  243. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_code_structure/test_tutorial001.py +0 -0
  244. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_code_structure/test_tutorial002.py +0 -0
  245. {sqlmodel-0.0.44/tests/test_tutorial/test_connect/test_delete → sqlmodel-0.0.45/tests/test_tutorial/test_connect}/__init__.py +0 -0
  246. {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
  247. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_create_connected_tables/test_tutorial001.py +0 -0
  248. {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
  249. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_delete/test_tutorial001.py +0 -0
  250. {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
  251. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_insert/test_tutorial001.py +0 -0
  252. {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
  253. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_select/test_tutorial001_tutorial002.py +0 -0
  254. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_select/test_tutorial003.py +0 -0
  255. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_select/test_tutorial004.py +0 -0
  256. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_select/test_tutorial005.py +0 -0
  257. {sqlmodel-0.0.44/tests/test_tutorial/test_delete → sqlmodel-0.0.45/tests/test_tutorial/test_connect/test_update}/__init__.py +0 -0
  258. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_connect/test_update/test_tutorial001.py +0 -0
  259. {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
  260. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_create_db_and_table/test_tutorial001.py +0 -0
  261. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_create_db_and_table/test_tutorial002.py +0 -0
  262. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_create_db_and_table/test_tutorial003.py +0 -0
  263. {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
  264. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_delete/test_tutorial001_tutorial002.py +0 -0
  265. {sqlmodel-0.0.44/tests/test_tutorial/test_fastapi/test_delete → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi}/__init__.py +0 -0
  266. {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
  267. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests001.py +0 -0
  268. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests002.py +0 -0
  269. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests003.py +0 -0
  270. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests004.py +0 -0
  271. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests005.py +0 -0
  272. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests006.py +0 -0
  273. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_app_testing/test_tutorial001_tests_main.py +0 -0
  274. {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
  275. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_delete/test_tutorial001.py +0 -0
  276. {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
  277. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_limit_and_offset/test_tutorial001.py +0 -0
  278. {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
  279. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial001.py +0 -0
  280. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_multiple_models/test_tutorial002.py +0 -0
  281. {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
  282. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_read_one/test_tutorial001.py +0 -0
  283. {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
  284. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_relationships/test_tutorial001.py +0 -0
  285. {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
  286. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_response_model/test_tutorial001.py +0 -0
  287. {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
  288. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_session_with_dependency/test_tutorial001.py +0 -0
  289. {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
  290. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_simple_hero_api/test_tutorial001.py +0 -0
  291. {sqlmodel-0.0.44/tests/test_tutorial/test_indexes → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_teams}/__init__.py +0 -0
  292. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_teams/test_tutorial001.py +0 -0
  293. {sqlmodel-0.0.44/tests/test_tutorial/test_insert → sqlmodel-0.0.45/tests/test_tutorial/test_fastapi/test_update}/__init__.py +0 -0
  294. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_update/test_tutorial001.py +0 -0
  295. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_fastapi/test_update/test_tutorial002.py +0 -0
  296. {sqlmodel-0.0.44/tests/test_tutorial/test_limit_and_offset → sqlmodel-0.0.45/tests/test_tutorial/test_indexes}/__init__.py +0 -0
  297. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_indexes/test_tutorial001.py +0 -0
  298. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_indexes/test_tutorial002.py +0 -0
  299. {sqlmodel-0.0.44/tests/test_tutorial/test_many_to_many → sqlmodel-0.0.45/tests/test_tutorial/test_insert}/__init__.py +0 -0
  300. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_insert/test_tutorial001.py +0 -0
  301. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_insert/test_tutorial002.py +0 -0
  302. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_insert/test_tutorial003.py +0 -0
  303. {sqlmodel-0.0.44/tests/test_tutorial/test_one → sqlmodel-0.0.45/tests/test_tutorial/test_limit_and_offset}/__init__.py +0 -0
  304. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_limit_and_offset/test_tutorial001.py +0 -0
  305. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_limit_and_offset/test_tutorial002.py +0 -0
  306. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_limit_and_offset/test_tutorial003.py +0 -0
  307. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_limit_and_offset/test_tutorial004.py +0 -0
  308. {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
  309. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_many_to_many/test_tutorial001.py +0 -0
  310. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_many_to_many/test_tutorial002.py +0 -0
  311. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_many_to_many/test_tutorial003.py +0 -0
  312. {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
  313. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial001.py +0 -0
  314. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial002.py +0 -0
  315. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial003.py +0 -0
  316. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial004.py +0 -0
  317. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial005.py +0 -0
  318. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial006.py +0 -0
  319. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial007.py +0 -0
  320. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial008.py +0 -0
  321. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_one/test_tutorial009.py +0 -0
  322. {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
  323. {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
  324. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial001.py +0 -0
  325. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial002.py +0 -0
  326. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_back_populates/test_tutorial003.py +0 -0
  327. {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
  328. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_create_and_update_relationships/test_tutorial001.py +0 -0
  329. {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
  330. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_define_relationship_attributes/test_tutorial001.py +0 -0
  331. {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
  332. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial001.py +0 -0
  333. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial002.py +0 -0
  334. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial003.py +0 -0
  335. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial004.py +0 -0
  336. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_delete_records_relationship/test_tutorial005.py +0 -0
  337. {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
  338. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_read_relationships/test_tutorial001.py +0 -0
  339. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_relationship_attributes/test_read_relationships/test_tutorial002.py +0 -0
  340. {sqlmodel-0.0.44/tests/test_tutorial/test_where → sqlmodel-0.0.45/tests/test_tutorial/test_select}/__init__.py +0 -0
  341. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_select/test_tutorial001_tutorial002.py +0 -0
  342. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_select/test_tutorial003_tutorial004.py +0 -0
  343. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_update/test_tutorial001_tutorial002.py +0 -0
  344. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_update/test_tutorial003_tutorial004.py +0 -0
  345. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial001.py +0 -0
  346. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial002.py +0 -0
  347. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial003.py +0 -0
  348. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial004.py +0 -0
  349. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial005.py +0 -0
  350. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial006.py +0 -0
  351. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial006b.py +0 -0
  352. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial007.py +0 -0
  353. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial008.py +0 -0
  354. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial009.py +0 -0
  355. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_tutorial/test_where/test_tutorial011.py +0 -0
  356. {sqlmodel-0.0.44 → sqlmodel-0.0.45}/tests/test_update.py +0 -0
  357. {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.44
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"
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.44"
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
- return get_sa_type_from_type_annotation(get_args(annotation)[0])
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.annotation
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
- return DateTime
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