Coverage for tests / test_field_sa_column.py: 100%

54 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-06-10 09:40 +0000

1from typing import Annotated 1abcdefgh

2 

3import pytest 1abcdefgh

4from sqlalchemy import Column, Integer, String 1abcdefgh

5from sqlmodel import Field, SQLModel 1abcdefgh

6 

7 

8def test_sa_column_takes_precedence() -> None: 1abcdefgh

9 class Item(SQLModel, table=True): 1qrstuvwx

10 id: int | None = Field( 1qrstuvwx

11 default=None, 

12 sa_column=Column(String, primary_key=True, nullable=False), 

13 ) 

14 

15 # It would have been nullable with no sa_column 

16 assert Item.id.nullable is False # type: ignore 1qrstuvwx

17 assert isinstance(Item.id.type, String) # type: ignore 1qrstuvwx

18 

19 

20def test_sa_column_with_annotated_metadata() -> None: 1abcdefgh

21 class Item(SQLModel, table=True): 1yzABCDEF

22 id: Annotated[int | None, "meta"] = Field( 1yzABCDEF

23 default=None, 

24 sa_column=Column(String, primary_key=True, nullable=False), 

25 ) 

26 

27 assert Item.id.nullable is False # type: ignore 1yzABCDEF

28 assert isinstance(Item.id.type, String) # type: ignore 1yzABCDEF

29 

30 

31def test_sa_column_no_sa_args() -> None: 1abcdefgh

32 with pytest.raises(RuntimeError): 1GHIJKLMN

33 

34 class Item(SQLModel, table=True): 1GHIJKLMN

35 id: int | None = Field( 1GHIJKLMN

36 default=None, 

37 sa_column_args=[Integer], 

38 sa_column=Column(Integer, primary_key=True), 

39 ) 

40 

41 

42def test_sa_column_no_sa_kargs() -> None: 1abcdefgh

43 with pytest.raises(RuntimeError): 1OPQRSTUV

44 

45 class Item(SQLModel, table=True): 1OPQRSTUV

46 id: int | None = Field( 1OPQRSTUV

47 default=None, 

48 sa_column_kwargs={"primary_key": True}, 

49 sa_column=Column(Integer, primary_key=True), 

50 ) 

51 

52 

53def test_sa_column_no_type() -> None: 1abcdefgh

54 with pytest.raises(RuntimeError): 1WXYZ0123

55 

56 class Item(SQLModel, table=True): 1WXYZ0123

57 id: int | None = Field( 1WXYZ0123

58 default=None, 

59 sa_type=Integer, 

60 sa_column=Column(Integer, primary_key=True), 

61 ) 

62 

63 

64def test_sa_column_no_primary_key() -> None: 1abcdefgh

65 with pytest.raises(RuntimeError): 1456789!#

66 

67 class Item(SQLModel, table=True): 1456789!#

68 id: int | None = Field( 1456789!#

69 default=None, 

70 primary_key=True, 

71 sa_column=Column(Integer, primary_key=True), 

72 ) 

73 

74 

75def test_sa_column_no_nullable() -> None: 1abcdefgh

76 with pytest.raises(RuntimeError): 1$%'()*+,

77 

78 class Item(SQLModel, table=True): 1$%'()*+,

79 id: int | None = Field( 1$%'()*+,

80 default=None, 

81 nullable=True, 

82 sa_column=Column(Integer, primary_key=True), 

83 ) 

84 

85 

86def test_sa_column_no_foreign_key() -> None: 1abcdefgh

87 with pytest.raises(RuntimeError): 1ijklmnop

88 

89 class Team(SQLModel, table=True): 1ijklmnop

90 id: int | None = Field(default=None, primary_key=True) 1ijklmnop

91 name: str 1ijklmnop

92 

93 class Hero(SQLModel, table=True): 1ijklmnop

94 id: int | None = Field(default=None, primary_key=True) 1ijklmnop

95 team_id: int | None = Field( 1ijklmnop

96 default=None, 

97 foreign_key="team.id", 

98 sa_column=Column(Integer, primary_key=True), 

99 ) 

100 

101 

102def test_sa_column_no_unique() -> None: 1abcdefgh

103 with pytest.raises(RuntimeError): 1-./:;=?@

104 

105 class Item(SQLModel, table=True): 1-./:;=?@

106 id: int | None = Field( 1-./:;=?@

107 default=None, 

108 unique=True, 

109 sa_column=Column(Integer, primary_key=True), 

110 ) 

111 

112 

113def test_sa_column_no_index() -> None: 1abcdefgh

114 with pytest.raises(RuntimeError): 1[]^_`{|}

115 

116 class Item(SQLModel, table=True): 1[]^_`{|}

117 id: int | None = Field( 1[]^_`{|}

118 default=None, 

119 index=True, 

120 sa_column=Column(Integer, primary_key=True), 

121 ) 

122 

123 

124def test_sa_column_no_ondelete() -> None: 1abcdefgh

125 with pytest.raises(RuntimeError): 2~ abbbcbdbebfbgb

126 

127 class Item(SQLModel, table=True): 2~ abbbcbdbebfbgb

128 id: int | None = Field( 2~ abbbcbdbebfbgb

129 default=None, 

130 sa_column=Column(Integer, primary_key=True), 

131 ondelete="CASCADE", 

132 )