Coverage for sqlmodel / orm / session.py: 100%

29 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-11-09 00:02 +0000

1from collections.abc import Mapping, Sequence 1abcgdhefi

2from typing import ( 1abcgdhefi

3 Any, 

4 TypeVar, 

5 overload, 

6) 

7 

8from sqlalchemy import util 1abcgdhefi

9from sqlalchemy.engine.cursor import CursorResult 1abcgdhefi

10from sqlalchemy.engine.interfaces import _CoreAnyExecuteParams 1abcgdhefi

11from sqlalchemy.engine.result import Result, ScalarResult, TupleResult 1abcgdhefi

12from sqlalchemy.orm import Query as _Query 1abcgdhefi

13from sqlalchemy.orm import Session as _Session 1abcgdhefi

14from sqlalchemy.orm._typing import OrmExecuteOptionsParameter 1abcgdhefi

15from sqlalchemy.sql._typing import _ColumnsClauseArgument 1abcgdhefi

16from sqlalchemy.sql.base import Executable as _Executable 1abcgdhefi

17from sqlalchemy.sql.dml import UpdateBase 1abcgdhefi

18from sqlmodel.sql.base import Executable 1abcgdhefi

19from sqlmodel.sql.expression import Select, SelectOfScalar 1abcgdhefi

20from typing_extensions import TypeVarTuple, Unpack, deprecated 1abcgdhefi

21 

22_TSelectParam = TypeVar("_TSelectParam", bound=Any) 1abcgdhefi

23_Ts = TypeVarTuple("_Ts") 1abcgdhefi

24 

25 

26class Session(_Session): 1abcgdhefi

27 @overload 1abcgdhefi

28 def exec( 1abcgdhefi

29 self, 

30 statement: Select[Unpack[_Ts]], 1abcdef

31 *, 

32 params: Mapping[str, Any] | Sequence[Mapping[str, Any]] | None = None, 1abcgdhefi

33 execution_options: Mapping[str, Any] = util.EMPTY_DICT, 1abcgdhefi

34 bind_arguments: dict[str, Any] | None = None, 1abcgdhefi

35 _parent_execute_state: Any | None = None, 1abcgdhefi

36 _add_event: Any | None = None, 1abcgdhefi

37 ) -> TupleResult[tuple[Unpack[_Ts]]]: ... 1abcdef

38 

39 @overload 1abcgdhefi

40 def exec( 1abcgdhefi

41 self, 

42 statement: SelectOfScalar[_TSelectParam], 1abcdef

43 *, 

44 params: Mapping[str, Any] | Sequence[Mapping[str, Any]] | None = None, 1abcgdhefi

45 execution_options: Mapping[str, Any] = util.EMPTY_DICT, 1abcgdhefi

46 bind_arguments: dict[str, Any] | None = None, 1abcgdhefi

47 _parent_execute_state: Any | None = None, 1abcgdhefi

48 _add_event: Any | None = None, 1abcgdhefi

49 ) -> ScalarResult[_TSelectParam]: ... 1abcdef

50 

51 @overload 1abcgdhefi

52 def exec( 1abcgdhefi

53 self, 

54 statement: UpdateBase, 1abcdef

55 *, 

56 params: Mapping[str, Any] | Sequence[Mapping[str, Any]] | None = None, 1abcgdhefi

57 execution_options: Mapping[str, Any] = util.EMPTY_DICT, 1abcgdhefi

58 bind_arguments: dict[str, Any] | None = None, 1abcgdhefi

59 _parent_execute_state: Any | None = None, 1abcgdhefi

60 _add_event: Any | None = None, 1abcgdhefi

61 ) -> CursorResult[Unpack[tuple[Any, ...]]]: ... 1abcdef

62 

63 def exec( 1abcgdhefi

64 self, 

65 statement: Select[Unpack[_Ts]] 

66 | SelectOfScalar[_TSelectParam] 

67 | Executable[_TSelectParam] 

68 | UpdateBase, 

69 *, 

70 params: Mapping[str, Any] | Sequence[Mapping[str, Any]] | None = None, 

71 execution_options: Mapping[str, Any] = util.EMPTY_DICT, 

72 bind_arguments: dict[str, Any] | None = None, 

73 _parent_execute_state: Any | None = None, 

74 _add_event: Any | None = None, 

75 ) -> ( 

76 TupleResult[tuple[Unpack[_Ts]]] 

77 | ScalarResult[_TSelectParam] 

78 | CursorResult[Unpack[tuple[Any, ...]]] 

79 ): 

80 results = super().execute( 2FeGeT Hej k ~hU IeV W JeKeX Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( LeMeNeOePeQeReSeTe) * UeVeWel m XeYe+ , - . / : ; = ? Ze0e1e2e@ [ ] ^ 3e4e5e6e7e8e9e!e#e$e%e'e(e_ )en o ai` *e{ | +e,e} ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqb-e.e/e:e;e=e?e@e[erbsb]e^e_ep q `e{etbubvbwbxbybzbAbBb|e}e~eafCbDbEbFbbfcfdfefffgfhfifjfkflfmfnfGbofr s biHbpfIbJbqfrfKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2bsftfufvfwfxfyfzfAf3b4bBfCfDft u EfFf5b6b7b8b9b!b#b$b%bGfHfIfJf'b(b)b*bKfLfMfNfOfPfQfRfSfTfUfVfWf+bXfv w ci,bYf-b.bZf0f/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdc1f2f3f4f5f6f7f8f9fecfc!f#f$fx y %f'fgchcicjckclcmcncoc(f)f*f+fpcqcrcsc,f-f.f/f:f;f=f?f@f[f]f^f_ftc`fz A diuc{fvcwc|f}fxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPc~fagbgcgdgegfggghgQcRcigjgkgB C lgmgScTcUcVcWcXcYcZc0cngogpgqg1c2c3c4crgsgtgugvgwgxgygzgAgBgCgDg5cEgD E ei6cFg7c8cGgHg9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@cIgJgKgLgMgNgOgPgQg[c]cRgSgTgF G UgVg^c_c`c{c|c}c~cadbdWgXgYgZgcdddedfd0g1g2g3g4g5g6g7g8g9g!g#g$ggd%gH I fihd'gidjd(g)gkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCd*g+g,g-g.g/g:g;g=gDdEd?g@g[gJ K ]g^gFdGdHdIdJdKdLdMdNd_g`g{g|gOdPdQdRd}g~gahbhchdhehfhghhhihjhkhSdlhL M giTdmhUdVdnhohWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'dphqhrhshthuhvhwhxh(d)dyhzhAhN O BhCh*d+d,d-d.d/d:d;d=dDhEhFhGh?d@d[d]dHhIhJhKhLhMhNhOhPhQhRhShTh^dUhP Q hi_dVh`d{dWhXh|d}d~daebecedeeefegeheiejekelemeneoepeYhZh0h1h2h3h4h5h6hqere7h8h9hR S !h#hseteuevewexeyezeAe$h%h'h(hBeCeDeEe)h*h+h,h-h.h/h:h;h=h?h

81 statement, 

82 params=params, 

83 execution_options=execution_options, 

84 bind_arguments=bind_arguments, 

85 _parent_execute_state=_parent_execute_state, 

86 _add_event=_add_event, 

87 ) 

88 if isinstance(statement, SelectOfScalar): 2FeGeT Hej k U IeV W JeKeX Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( LeMeNeOePeQeReSeTe) * UeVeWel m XeYe+ , - . / : ; = ? Ze0e1e2e@ [ ] ^ 3e4e5e6e7e8e9e!e#e$e%e'e(e_ )en o ` *e{ | +e,e} ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqb-e.e/e:e;e=e?e@e[erbsb]e^e_ep q `e{etbubvbwbxbybzbAbBb|e}e~eafCbDbEbFbbfcfdfefffgfhfifjfkflfmfnfGbofr s HbpfIbJbqfrfKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2bsftfufvfwfxfyfzfAf3b4bBfCfDft u EfFf5b6b7b8b9b!b#b$b%bGfHfIfJf'b(b)b*bKfLfMfNfOfPfQfRfSfTfUfVfWf+bXfv w ,bYf-b.bZf0f/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdc1f2f3f4f5f6f7f8f9fecfc!f#f$fx y %f'fgchcicjckclcmcncoc(f)f*f+fpcqcrcsc,f-f.f/f:f;f=f?f@f[f]f^f_ftc`fz A uc{fvcwc|f}fxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPc~fagbgcgdgegfggghgQcRcigjgkgB C lgmgScTcUcVcWcXcYcZc0cngogpgqg1c2c3c4crgsgtgugvgwgxgygzgAgBgCgDg5cEgD E 6cFg7c8cGgHg9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@cIgJgKgLgMgNgOgPgQg[c]cRgSgTgF G UgVg^c_c`c{c|c}c~cadbdWgXgYgZgcdddedfd0g1g2g3g4g5g6g7g8g9g!g#g$ggd%gH I hd'gidjd(g)gkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCd*g+g,g-g.g/g:g;g=gDdEd?g@g[gJ K ]g^gFdGdHdIdJdKdLdMdNd_g`g{g|gOdPdQdRd}g~gahbhchdhehfhghhhihjhkhSdlhL M TdmhUdVdnhohWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'dphqhrhshthuhvhwhxh(d)dyhzhAhN O BhCh*d+d,d-d.d/d:d;d=dDhEhFhGh?d@d[d]dHhIhJhKhLhMhNhOhPhQhRhShTh^dUhP Q _dVh`d{dWhXh|d}d~daebecedeeefegeheiejekelemeneoepeYhZh0h1h2h3h4h5h6hqere7h8h9hR S !h#hseteuevewexeyezeAe$h%h'h(hBeCeDeEe)h*h+h,h-h.h/h:h;h=h?h

89 return results.scalars() 2FeGeT Hej k U IeV W Ke0 2 3 4 5 6 7 8 9 ! # $ % ' ( LeMeNeOePeQeReSeTe) * UeVeWel m XeYe+ , - . / : ; = ? Ze0e1e2e@ [ ] ^ 3e4e5e6e7e8e9e!e#e$e%e'e(e_ )en o ` *e{ | ,ebbdbebfbgbhbibjbkblbmbnbobpbqb-e.e/e:e;e=e?e@e[erbsb]e^e_ep q `e{etbubvbwbxbybzbAbBb|e}e~eafCbDbEbFbbfcfdfefffgfhfifjfkflfmfnfGbofr s HbpfIbJbrfNbPbQbRbSbTbUbVbWbXbYbZb0b1b2bsftfufvfwfxfyfzfAf3b4bBfCfDft u EfFf5b6b7b8b9b!b#b$b%bGfHfIfJf'b(b)b*bKfLfMfNfOfPfQfRfSfTfUfVfWf+bXfv w ,bYf-b.b0f=b@b[b]b^b_b`b{b|b}b~bacbcccdc1f2f3f4f5f6f7f8f9fecfc!f#f$fx y %f'fgchcicjckclcmcncoc(f)f*f+fpcqcrcsc,f-f.f/f:f;f=f?f@f[f]f^f_ftc`fz A uc{fvcwc}fAcCcDcEcFcGcHcIcJcKcLcMcNcOcPc~fagbgcgdgegfggghgQcRcigjgkgB C lgmgScTcUcVcWcXcYcZc0cngogpgqg1c2c3c4crgsgtgugvgwgxgygzgAgBgCgDg5cEgD E 6cFg7c8cHg$c'c(c)c*c+c,c-c.c/c:c;c=c?c@cIgJgKgLgMgNgOgPgQg[c]cRgSgTgF G UgVg^c_c`c{c|c}c~cadbdWgXgYgZgcdddedfd0g1g2g3g4g5g6g7g8g9g!g#g$ggd%gH I hd'gidjd)gndpdqdrdsdtdudvdwdxdydzdAdBdCd*g+g,g-g.g/g:g;g=gDdEd?g@g[gJ K ]g^gFdGdHdIdJdKdLdMdNd_g`g{g|gOdPdQdRd}g~gahbhchdhehfhghhhihjhkhSdlhL M TdmhUdVdohZd1d2d3d4d5d6d7d8d9d!d#d$d%d'dphqhrhshthuhvhwhxh(d)dyhzhAhN O BhCh*d+d,d-d.d/d:d;d=dDhEhFhGh?d@d[d]dHhIhJhKhLhMhNhOhPhQhRhShTh^dUhP Q _dVh`d{dXhaecedeeefegeheiejekelemeneoepeYhZh0h1h2h3h4h5h6hqere7h8h9hR S !h#hseteuevewexeyezeAe$h%h'h(hBeCeDeEe)h*h+h,h-h.h/h:h;h=h?h

90 return results # type: ignore 2j k JeX Y Z 1 l m n o +e} ~ abcbp q r s qfKbLbMbObt u v w Zf/b:b;b?bx y z A |fxcyczcBcB C D E Gg9c!c#c%cF G H I (gkdldmdodJ K L M nhWdXdYd0dN O P Q Wh|d}d~dbeR S

91 

92 @deprecated( 1abcgdhefi

93 """ 

94 🚨 You probably want to use `session.exec()` instead of `session.execute()`. 

95 

96 This is the original SQLAlchemy `session.execute()` method that returns objects 

97 of type `Row`, on which you have to call `scalars()` to get the model objects. 

98 

99 For example: 

100 

101 ```Python 

102 heroes = session.execute(select(Hero)).scalars().all() 

103 ``` 

104 

105 Instead, you could use `exec()`: 

106 

107 ```Python 

108 heroes = session.exec(select(Hero)).all() 

109 ``` 

110 """, 

111 category=None, 

112 ) 

113 def execute( 1abcgdhefi

114 self, 

115 statement: _Executable, 

116 params: _CoreAnyExecuteParams | None = None, 

117 *, 

118 execution_options: OrmExecuteOptionsParameter = util.EMPTY_DICT, 

119 bind_arguments: dict[str, Any] | None = None, 

120 _parent_execute_state: Any | None = None, 

121 _add_event: Any | None = None, 

122 ) -> Result[Unpack[tuple[Any, ...]]]: 

123 """ 

124 🚨 You probably want to use `session.exec()` instead of `session.execute()`. 

125 

126 This is the original SQLAlchemy `session.execute()` method that returns objects 

127 of type `Row`, on which you have to call `scalars()` to get the model objects. 

128 

129 For example: 

130 

131 ```Python 

132 heroes = session.execute(select(Hero)).scalars().all() 

133 ``` 

134 

135 Instead, you could use `exec()`: 

136 

137 ```Python 

138 heroes = session.exec(select(Hero)).all() 

139 ``` 

140 """ 

141 return super().execute( 2iijikiliminioipiqirisitiuiviT wij k xiyiU ziAiV W Bi@hCiDiEiFiGiX Y Z 0 1 Hi2 3 IiJiKiLiMiNi4 5 6 7 8 9 ! # $ % ' ( Oi) * l m PiQi+ , RiSi- . / : ; = ? @ [ ] ^ TiUiViWiXiYiZi0i1i2i3i4i5i6i_ 7in o 8i9i` !i#i{ | $i[h%i'i(i)i*i} ~ abbbcb+idbeb,i-i.i/i:i;ifbgbhbibjbkblbmbnbobpbqb=irbsbp q ?i@itbub[i]ivbwbxbybzbAbBbCbDbEbFb^i_i`i{i|i}i~iajbjcjdjejfjgjGbhjr s ijjjHbkjljIbJbmj]hnjojpjqjrjKbLbMbNbObsjPbQbtjujvjwjxjyjRbSbTbUbVbWbXbYbZb0b1b2bzj3b4bt u AjBj5b6bCjDj7b8b9b!b#b$b%b'b(b)b*bEjFjGjHjIjJjKjLjMjNjOjPjQjRj+bSjv w TjUj,bVjWj-b.bXj^hYjZj0j1j2j/b:b;b=b?b3j@b[b4j5j6j7j8j9j]b^b_b`b{b|b}b~bacbcccdc!jecfcx y #j$jgchc%j'jicjckclcmcncocpcqcrcsc(j)j*j+j,j-j.j/j:j;j=j?j@j[jtc]jz A ^j_juc`j{jvcwc|j_h}j~jakbkckxcyczcAcBcdkCcDcekfkgkhkikjkEcFcGcHcIcJcKcLcMcNcOcPckkQcRcB C lkmkScTcnkokUcVcWcXcYcZc0c1c2c3c4cpkqkrksktkukvkwkxkykzkAkBkCk5cDkD E EkFk6cGkHk7c8cIk`hJkKkLkMkNk9c!c#c$c%cOk'c(cPkQkRkSkTkUk)c*c+c,c-c.c/c:c;c=c?c@cVk[c]cF G WkXk^c_cYkZk`c{c|c}c~cadbdcdddedfd0k1k2k3k4k5k6k7k8k9k!k#k$k%kgd'kH I (k)khd*k+kidjd,k{h-k.k/k:k;kkdldmdndod=kpdqd?k@k[k]k^k_krdsdtdudvdwdxdydzdAdBdCd`kDdEdJ K {k|kFdGd}k~kHdIdJdKdLdMdNdOdPdQdRdalblcldlelflglhliljlklllmlnlSdolL M plqlTdrlslUdVdtl|hulvlwlxlylWdXdYdZd0dzl1d2dAlBlClDlElFl3d4d5d6d7d8d9d!d#d$d%d'dGl(d)dN O HlIl*d+dJlKl,d-d.d/d:d;d=d?d@d[d]dLlMlNlOlPlQlRlSlTlUlVlWlXlYl^dZlP Q 0l1l_d2l3l`d{d4l}h5l6l7l8l9l|d}d~daebe!lcede#l$l%l'l(l)leefegeheiejekelemeneoepe*lqereR S +l,lsete-l.luevewexeyezeAeBeCeDeEe

142 statement, 

143 params=params, 

144 execution_options=execution_options, 

145 bind_arguments=bind_arguments, 

146 _parent_execute_state=_parent_execute_state, 

147 _add_event=_add_event, 

148 ) 

149 

150 @deprecated( 1abcgdhefi

151 """ 

152 🚨 You probably want to use `session.exec()` instead of `session.query()`. 

153 

154 `session.exec()` is SQLModel's own short version with improved type 

155 annotations. 

156 

157 Otherwise, you might want to use `session.execute()` instead of 

158 `session.query()`. 

159 """ 

160 ) 

161 def query( # type: ignore 1abcgdhefi

162 self, *entities: _ColumnsClauseArgument[Any], **kwargs: Any 

163 ) -> _Query[Any]: 

164 """ 

165 🚨 You probably want to use `session.exec()` instead of `session.query()`. 

166 

167 `session.exec()` is SQLModel's own short version with improved type 

168 annotations. 

169 

170 Otherwise, you might want to use `session.execute()` instead of 

171 `session.query()`. 

172 """ 

173 return super().query(*entities, **kwargs) 2@h[h]h^h_h`h{h|h}h