Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion sqlmodel/ext/asyncio/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
overload,
)

from sqlalchemy import util
from sqlalchemy import TextClause, util
from sqlalchemy.engine.cursor import CursorResult
from sqlalchemy.engine.interfaces import _CoreAnyExecuteParams
from sqlalchemy.engine.result import Result, ScalarResult, TupleResult
Expand Down Expand Up @@ -71,13 +71,26 @@ async def exec(
_add_event: Optional[Any] = None,
) -> CursorResult[Any]: ...

@overload
async def exec(
self,
statement: TextClause,
*,
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
bind_arguments: Optional[Dict[str, Any]] = None,
_parent_execute_state: Optional[Any] = None,
_add_event: Optional[Any] = None,
) -> CursorResult[Any]: ...

async def exec(
self,
statement: Union[
Select[_TSelectParam],
SelectOfScalar[_TSelectParam],
Executable[_TSelectParam],
UpdateBase,
TextClause,
],
*,
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,
Expand Down
15 changes: 14 additions & 1 deletion sqlmodel/orm/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
overload,
)

from sqlalchemy import util
from sqlalchemy import TextClause, util
from sqlalchemy.engine.cursor import CursorResult
from sqlalchemy.engine.interfaces import _CoreAnyExecuteParams
from sqlalchemy.engine.result import Result, ScalarResult, TupleResult
Expand Down Expand Up @@ -63,13 +63,26 @@ def exec(
_add_event: Optional[Any] = None,
) -> CursorResult[Any]: ...

@overload
def exec(
self,
statement: TextClause,
*,
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,
execution_options: Mapping[str, Any] = util.EMPTY_DICT,
bind_arguments: Optional[Dict[str, Any]] = None,
_parent_execute_state: Optional[Any] = None,
_add_event: Optional[Any] = None,
) -> CursorResult[Any]: ...

def exec(
self,
statement: Union[
Select[_TSelectParam],
SelectOfScalar[_TSelectParam],
Executable[_TSelectParam],
UpdateBase,
TextClause,
],
*,
params: Optional[Union[Mapping[str, Any], Sequence[Mapping[str, Any]]]] = None,
Expand Down
49 changes: 49 additions & 0 deletions tests/test_exec_text.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from typing import Optional

from sqlmodel import Field, Session, SQLModel, create_engine, text


def test_select_using_text_statement(clear_sqlmodel):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
secret_name: str
age: Optional[int] = None

hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")

engine = create_engine("sqlite://")

SQLModel.metadata.create_all(engine)

with Session(engine) as session:
session.add(hero_1)
session.commit()
session.refresh(hero_1)

with Session(engine) as session:
res = session.exec(text("SELECT * FROM hero")).all()
assert len(res) == 1
assert res[0] == (1, "Deadpond", "Dive Wilson", None)


def test_insert_using_text_statement(clear_sqlmodel):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
secret_name: str
age: Optional[int] = None

engine = create_engine("sqlite://")

SQLModel.metadata.create_all(engine)

with Session(engine) as session:
res = session.exec(
text(
"INSERT INTO hero (name, secret_name) VALUES ('Deadpond', 'Dive Wilson')"
)
)
session.commit()

assert res.rowcount == 1
Loading