Skip to content

Commit c931342

Browse files
committed
Add overload for text() to Session.exec and AsyncSession.exec
1 parent dbfd189 commit c931342

File tree

3 files changed

+77
-2
lines changed

3 files changed

+77
-2
lines changed

sqlmodel/ext/asyncio/session.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
overload,
1212
)
1313

14-
from sqlalchemy import util
14+
from sqlalchemy import TextClause, util
1515
from sqlalchemy.engine.cursor import CursorResult
1616
from sqlalchemy.engine.interfaces import _CoreAnyExecuteParams
1717
from sqlalchemy.engine.result import Result, ScalarResult, TupleResult
@@ -71,13 +71,26 @@ async def exec(
7171
_add_event: Optional[Any] = None,
7272
) -> CursorResult[Any]: ...
7373

74+
@overload
75+
async def exec(
76+
self,
77+
statement: TextClause,
78+
*,
79+
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,
80+
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
81+
bind_arguments: Optional[Dict[str, Any]] = None,
82+
_parent_execute_state: Optional[Any] = None,
83+
_add_event: Optional[Any] = None,
84+
) -> CursorResult[Any]: ...
85+
7486
async def exec(
7587
self,
7688
statement: Union[
7789
Select[_TSelectParam],
7890
SelectOfScalar[_TSelectParam],
7991
Executable[_TSelectParam],
8092
UpdateBase,
93+
TextClause,
8194
],
8295
*,
8396
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,

sqlmodel/orm/session.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
overload,
1010
)
1111

12-
from sqlalchemy import util
12+
from sqlalchemy import TextClause, util
1313
from sqlalchemy.engine.cursor import CursorResult
1414
from sqlalchemy.engine.interfaces import _CoreAnyExecuteParams
1515
from sqlalchemy.engine.result import Result, ScalarResult, TupleResult
@@ -63,13 +63,26 @@ def exec(
6363
_add_event: Optional[Any] = None,
6464
) -> CursorResult[Any]: ...
6565

66+
@overload
67+
def exec(
68+
self,
69+
statement: TextClause,
70+
*,
71+
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,
72+
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
73+
bind_arguments: Optional[Dict[str, Any]] = None,
74+
_parent_execute_state: Optional[Any] = None,
75+
_add_event: Optional[Any] = None,
76+
) -> CursorResult[Any]: ...
77+
6678
def exec(
6779
self,
6880
statement: Union[
6981
Select[_TSelectParam],
7082
SelectOfScalar[_TSelectParam],
7183
Executable[_TSelectParam],
7284
UpdateBase,
85+
TextClause,
7386
],
7487
*,
7588
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,

tests/test_exec_text.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from typing import Optional
2+
3+
from sqlmodel import Field, Session, SQLModel, create_engine, text
4+
5+
6+
def test_select_using_text_statement(clear_sqlmodel):
7+
class Hero(SQLModel, table=True):
8+
id: Optional[int] = Field(default=None, primary_key=True)
9+
name: str
10+
secret_name: str
11+
age: Optional[int] = None
12+
13+
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
14+
15+
engine = create_engine("sqlite://")
16+
17+
SQLModel.metadata.create_all(engine)
18+
19+
with Session(engine) as session:
20+
session.add(hero_1)
21+
session.commit()
22+
session.refresh(hero_1)
23+
24+
with Session(engine) as session:
25+
res = session.exec(text("SELECT * FROM hero")).all()
26+
assert len(res) == 1
27+
assert res[0] == (1, "Deadpond", "Dive Wilson", None)
28+
29+
30+
def test_insert_using_text_statement(clear_sqlmodel):
31+
class Hero(SQLModel, table=True):
32+
id: Optional[int] = Field(default=None, primary_key=True)
33+
name: str
34+
secret_name: str
35+
age: Optional[int] = None
36+
37+
engine = create_engine("sqlite://")
38+
39+
SQLModel.metadata.create_all(engine)
40+
41+
with Session(engine) as session:
42+
res = session.exec(
43+
text(
44+
"INSERT INTO hero (name, secret_name) VALUES ('Deadpond', 'Dive Wilson')"
45+
)
46+
)
47+
session.commit()
48+
49+
assert res.rowcount == 1

0 commit comments

Comments
 (0)