[build-system] requires = ["pdm-backend"] build-backend = "pdm.backend" [project] name = "sqlmodel" dynamic = ["version"] description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." readme = "README.md" requires-python = ">=3.10" authors = [ { name = "Sebastián Ramírez", email = "tiangolo@gmail.com" }, ] license = "MIT" license-files = ["LICENSE"] classifiers = [ "Development Status :: 4 - Beta", "Framework :: AsyncIO", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Intended Audience :: System Administrators", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Database", "Topic :: Database :: Database Engines/Servers", "Topic :: Internet", "Topic :: Internet :: WWW/HTTP :: HTTP Servers", "Topic :: Internet :: WWW/HTTP", "Typing :: Typed", ] dependencies = [ "SQLAlchemy >=2.0.14,<2.1.0", "pydantic>=2.11.0", ] [project.urls] Homepage = "https://github.com/fastapi/sqlmodel" Documentation = "https://sqlmodel.tiangolo.com" Repository = "https://github.com/fastapi/sqlmodel" Issues = "https://github.com/fastapi/sqlmodel/issues" Changelog = "https://sqlmodel.tiangolo.com/release-notes/" [dependency-groups] dev = [ { include-group = "docs" }, { include-group = "tests" }, "prek>=0.2.24,<1.0.0", ] docs = [ "black>=24.1.0", "cairosvg==2.8.2", "griffe-typingdoc==0.3.0", "griffe-warnings-deprecated==1.1.0", "markdown-include-variants==0.0.8", "mdx-include>=1.4.1,<2.0.0", "mkdocs-macros-plugin==1.5.0", "mkdocs-material==9.7.1", "mkdocs-redirects>=1.2.1,<1.3.0", "mkdocstrings[python]==0.30.1", "pillow==11.3.0", "pyyaml>=5.3.1,<7.0.0", "typer==0.23.2", ] github-actions = [ "httpx>=0.27.0,<0.29.0", "pydantic>=2.5.3,<3.0.0", "pydantic-settings>=2.1.0,<3.0.0", "pygithub>=2.3.0,<3.0.0", "smokeshow>=0.5.0", ] tests = [ "black>=24.1.0", "coverage[toml]>=6.2,<8.0", "dirty-equals==0.11", "fastapi>=0.128.0", "httpx==0.28.1", "jinja2==3.1.6", "mypy==1.19.1", "pre-commit>=2.17.0,<5.0.0", "pytest>=7.0.1,<9.0.0", "ruff==0.15.1", "typing-extensions==4.15.0", ] [tool.pdm] version = { source = "file", path = "sqlmodel/__init__.py" } distribution = true [tool.pdm.build] source-includes = [ "tests/", "docs_src/", "scripts/", "sqlmodel/sql/expression.py.jinja2", ] [tool.tiangolo._internal-slim-build.packages.sqlmodel-slim.project] name = "sqlmodel-slim" readme = "sqlmodel-slim/README.md" dependencies = [ "sqlmodel", ] optional-dependencies = {} scripts = {} [tool.tiangolo._internal-slim-build.packages.sqlmodel-slim.tool.pdm.build] # excludes needs to explicitly exclude the top level python packages, # otherwise PDM includes them by default # A "*" glob pattern can't be used here because in PDM internals, the patterns are put # in a set (unordered, order varies) and each excluded file is assigned one of the # glob patterns that matches, as the set is unordered, the matched pattern could be "*" # independent of the order here. And then the internal code would give it a lower score # than the one for a default included file. # By not using "*" and explicitly excluding the top level packages, they get a higher # score than the default inclusion excludes = ["sqlmodel", "docs_src", "tests", "pdm_build.py"] # source-includes needs to explicitly define some value because PDM will check the # truthy value of the list, and if empty, will include some defaults, including "tests", # an empty string doesn't match anything, but makes the list truthy, so that PDM # doesn't override it during the build. source-includes = [""] [tool.coverage.run] parallel = true data_file = "coverage/.coverage" source = [ "docs_src", "tests", "sqlmodel" ] context = '${CONTEXT}' dynamic_context = "test_function" relative_files = true [tool.coverage.report] show_missing = true sort = "-Cover" exclude_lines = [ "pragma: no cover", "@overload", 'if __name__ == "__main__":', "if TYPE_CHECKING:", ] [tool.coverage.html] show_contexts = true [tool.mypy] strict = true exclude = "sqlmodel.sql._expression_select_gen" [[tool.mypy.overrides]] module = "docs_src.*" disallow_incomplete_defs = false disallow_untyped_defs = false disallow_untyped_calls = false [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade ] ignore = [ "E501", # line too long, handled by black "B008", # do not perform function calls in argument defaults "C901", # too complex "W191", # indentation contains tabs ] [tool.ruff.lint.per-file-ignores] # "__init__.py" = ["F401"] [tool.ruff.lint.isort] known-third-party = ["sqlmodel", "sqlalchemy", "pydantic", "fastapi"] [tool.ruff.lint.pyupgrade] # Preserve types, even if a file imports `from __future__ import annotations`. keep-runtime-typing = true