Skip to content

Commit 94a7d1a

Browse files
committed
Merge branch 'main' into dependabot/pip/mypy-1.18.1
2 parents 94d0cb3 + fd3f680 commit 94a7d1a

File tree

10 files changed

+81
-17
lines changed

10 files changed

+81
-17
lines changed

.github/workflows/test.yml

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,30 @@ jobs:
2525
test:
2626
strategy:
2727
matrix:
28-
os: [ ubuntu-latest ]
29-
python-version:
30-
- "3.8"
31-
- "3.9"
32-
- "3.10"
33-
- "3.11"
34-
- "3.12"
35-
- "3.13"
28+
os: [ ubuntu-latest, windows-latest, macos-latest ]
29+
python-version: [ "3.13" ]
3630
pydantic-version:
3731
- pydantic-v1
3832
- pydantic-v2
33+
include:
34+
- os: macos-latest
35+
python-version: "3.8"
36+
pydantic-version: pydantic-v1
37+
- os: windows-latest
38+
python-version: "3.9"
39+
pydantic-version: pydantic-v2
40+
- os: ubuntu-latest
41+
python-version: "3.10"
42+
pydantic-version: pydantic-v1
43+
- os: macos-latest
44+
python-version: "3.11"
45+
pydantic-version: pydantic-v2
46+
- os: windows-latest
47+
python-version: "3.12"
48+
pydantic-version: pydantic-v1
49+
- os: ubuntu-latest
50+
python-version: "3.12"
51+
pydantic-version: pydantic-v2
3952
fail-fast: false
4053
runs-on: ${{ matrix.os }}
4154
steps:
@@ -78,7 +91,7 @@ jobs:
7891
- name: Store coverage files
7992
uses: actions/upload-artifact@v4
8093
with:
81-
name: coverage-${{ matrix.python-version }}-${{ matrix.pydantic-version }}
94+
name: coverage-${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.pydantic-version }}
8295
path: coverage
8396
include-hidden-files: true
8497

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ repos:
1414
- id: end-of-file-fixer
1515
- id: trailing-whitespace
1616
- repo: https://github.com/astral-sh/ruff-pre-commit
17-
rev: v0.13.0
17+
rev: v0.13.1
1818
hooks:
1919
- id: ruff
2020
args:

docs/release-notes.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22

33
## Latest Changes
44

5+
### Internal
6+
7+
* ⬆ Bump typing-extensions from 4.13.2 to 4.15.0 for Python 3.9+. PR [#1580](https://github.com/fastapi/sqlmodel/pull/1580) by [@svlandeg](https://github.com/svlandeg).
8+
*[pre-commit.ci] pre-commit autoupdate. PR [#1571](https://github.com/fastapi/sqlmodel/pull/1571) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci).
9+
* ⬆ Bump typer from 0.17.4 to 0.19.2. PR [#1573](https://github.com/fastapi/sqlmodel/pull/1573) by [@dependabot[bot]](https://github.com/apps/dependabot).
10+
* ⬆ Bump ruff from 0.13.0 to 0.13.2. PR [#1576](https://github.com/fastapi/sqlmodel/pull/1576) by [@dependabot[bot]](https://github.com/apps/dependabot).
11+
* 💚 Fix CI test suite for Windows and MacOS. PR [#1307](https://github.com/fastapi/sqlmodel/pull/1307) by [@svlandeg](https://github.com/svlandeg).
12+
13+
## 0.0.25
14+
15+
### Features
16+
17+
* ✨ Add overload for `exec` method to support `insert`, `update`, `delete` statements. PR [#1342](https://github.com/fastapi/sqlmodel/pull/1342) by [@seriaati](https://github.com/seriaati).
18+
519
### Upgrades
620

721
* ⬆️ Drop support for Python 3.7, require Python 3.8 or above. PR [#1316](https://github.com/fastapi/sqlmodel/pull/1316) by [@svlandeg](https://github.com/svlandeg).

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ source = [
8181
]
8282
context = '${CONTEXT}'
8383
dynamic_context = "test_function"
84+
relative_files = true
8485

8586
[tool.coverage.report]
8687
show_missing = true

requirements-docs.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ cairosvg==2.8.2
1313
# mkdocstrings[python]==0.25.1
1414
griffe-typingdoc==0.2.9
1515
# For griffe, it formats with black
16-
typer == 0.17.4
16+
typer == 0.19.2
1717
mkdocs-macros-plugin==1.3.9
1818
markdown-include-variants==0.0.4

requirements-tests.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
pytest >=7.0.1,<9.0.0
44
coverage[toml] >=6.2,<8.0
55
mypy ==1.14.1
6-
ruff ==0.13.0
6+
ruff ==0.13.2
77
# For FastAPI tests
88
fastapi >=0.103.2
99
httpx ==0.28.1
1010
dirty-equals ==0.9.0
1111
jinja2 ==3.1.6
12-
typing-extensions ==4.13.2
12+
# Remove when support for Python 3.8 is dropped
13+
typing-extensions ==4.13.2; python_version < "3.9"
14+
typing-extensions ==4.15.0; python_version >= "3.9"

sqlmodel/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "0.0.24"
1+
__version__ = "0.0.25"
22

33
# Re-export from SQLAlchemy
44
from sqlalchemy.engine import create_engine as create_engine

sqlmodel/ext/asyncio/session.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@
1212
)
1313

1414
from sqlalchemy import util
15+
from sqlalchemy.engine.cursor import CursorResult
1516
from sqlalchemy.engine.interfaces import _CoreAnyExecuteParams
1617
from sqlalchemy.engine.result import Result, ScalarResult, TupleResult
1718
from sqlalchemy.ext.asyncio import AsyncSession as _AsyncSession
1819
from sqlalchemy.ext.asyncio.result import _ensure_sync_result
1920
from sqlalchemy.ext.asyncio.session import _EXECUTE_OPTIONS
2021
from sqlalchemy.orm._typing import OrmExecuteOptionsParameter
2122
from sqlalchemy.sql.base import Executable as _Executable
23+
from sqlalchemy.sql.dml import UpdateBase
2224
from sqlalchemy.util.concurrency import greenlet_spawn
2325
from typing_extensions import deprecated
2426

@@ -57,20 +59,35 @@ async def exec(
5759
_add_event: Optional[Any] = None,
5860
) -> ScalarResult[_TSelectParam]: ...
5961

62+
@overload
63+
async def exec(
64+
self,
65+
statement: UpdateBase,
66+
*,
67+
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,
68+
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
69+
bind_arguments: Optional[Dict[str, Any]] = None,
70+
_parent_execute_state: Optional[Any] = None,
71+
_add_event: Optional[Any] = None,
72+
) -> CursorResult[Any]: ...
73+
6074
async def exec(
6175
self,
6276
statement: Union[
6377
Select[_TSelectParam],
6478
SelectOfScalar[_TSelectParam],
6579
Executable[_TSelectParam],
80+
UpdateBase,
6681
],
6782
*,
6883
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,
6984
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
7085
bind_arguments: Optional[Dict[str, Any]] = None,
7186
_parent_execute_state: Optional[Any] = None,
7287
_add_event: Optional[Any] = None,
73-
) -> Union[TupleResult[_TSelectParam], ScalarResult[_TSelectParam]]:
88+
) -> Union[
89+
TupleResult[_TSelectParam], ScalarResult[_TSelectParam], CursorResult[Any]
90+
]:
7491
if execution_options:
7592
execution_options = util.immutabledict(execution_options).union(
7693
_EXECUTE_OPTIONS

sqlmodel/orm/session.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
)
1111

1212
from sqlalchemy import util
13+
from sqlalchemy.engine.cursor import CursorResult
1314
from sqlalchemy.engine.interfaces import _CoreAnyExecuteParams
1415
from sqlalchemy.engine.result import Result, ScalarResult, TupleResult
1516
from sqlalchemy.orm import Query as _Query
1617
from sqlalchemy.orm import Session as _Session
1718
from sqlalchemy.orm._typing import OrmExecuteOptionsParameter
1819
from sqlalchemy.sql._typing import _ColumnsClauseArgument
1920
from sqlalchemy.sql.base import Executable as _Executable
21+
from sqlalchemy.sql.dml import UpdateBase
2022
from sqlmodel.sql.base import Executable
2123
from sqlmodel.sql.expression import Select, SelectOfScalar
2224
from typing_extensions import deprecated
@@ -49,20 +51,35 @@ def exec(
4951
_add_event: Optional[Any] = None,
5052
) -> ScalarResult[_TSelectParam]: ...
5153

54+
@overload
55+
def exec(
56+
self,
57+
statement: UpdateBase,
58+
*,
59+
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,
60+
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
61+
bind_arguments: Optional[Dict[str, Any]] = None,
62+
_parent_execute_state: Optional[Any] = None,
63+
_add_event: Optional[Any] = None,
64+
) -> CursorResult[Any]: ...
65+
5266
def exec(
5367
self,
5468
statement: Union[
5569
Select[_TSelectParam],
5670
SelectOfScalar[_TSelectParam],
5771
Executable[_TSelectParam],
72+
UpdateBase,
5873
],
5974
*,
6075
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,
6176
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
6277
bind_arguments: Optional[Dict[str, Any]] = None,
6378
_parent_execute_state: Optional[Any] = None,
6479
_add_event: Optional[Any] = None,
65-
) -> Union[TupleResult[_TSelectParam], ScalarResult[_TSelectParam]]:
80+
) -> Union[
81+
TupleResult[_TSelectParam], ScalarResult[_TSelectParam], CursorResult[Any]
82+
]:
6683
results = super().execute(
6784
statement,
6885
params=params,

tests/test_select_gen.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def test_select_gen() -> None:
1313
env = os.environ.copy()
1414
env["CHECK_JINJA"] = "1"
1515
result = subprocess.run(
16-
[sys.executable, "scripts/generate_select.py"],
16+
[sys.executable, Path("scripts") / "generate_select.py"],
1717
env=env,
1818
check=True,
1919
cwd=root_path,

0 commit comments

Comments
 (0)