Coverage for tests/test_field_sa_column.py: 100%

49 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-10-27 00:03 +0000

1from typing import Optional 1abcdefghij

2 

3import pytest 1abcdefghij

4from sqlalchemy import Column, Integer, String 1abcdefghij

5from sqlmodel import Field, SQLModel 1abcdefghij

6 

7 

8def test_sa_column_takes_precedence() -> None: 1abcdefghij

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

10 id: Optional[int] = Field( 1uvwxyzABCD

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 1uvwxyzABCD

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

18 

19 

20def test_sa_column_no_sa_args() -> None: 1abcdefghij

21 with pytest.raises(RuntimeError): 1EFGHIJKLMN

22 

23 class Item(SQLModel, table=True): 1EFGHIJKLMN

24 id: Optional[int] = Field( 1EFGHIJKLMN

25 default=None, 

26 sa_column_args=[Integer], 

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

28 ) 

29 

30 

31def test_sa_column_no_sa_kargs() -> None: 1abcdefghij

32 with pytest.raises(RuntimeError): 1OPQRSTUVWX

33 

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

35 id: Optional[int] = Field( 1OPQRSTUVWX

36 default=None, 

37 sa_column_kwargs={"primary_key": True}, 

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

39 ) 

40 

41 

42def test_sa_column_no_type() -> None: 1abcdefghij

43 with pytest.raises(RuntimeError): 1YZ01234567

44 

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

46 id: Optional[int] = Field( 1YZ01234567

47 default=None, 

48 sa_type=Integer, 

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

50 ) 

51 

52 

53def test_sa_column_no_primary_key() -> None: 1abcdefghij

54 with pytest.raises(RuntimeError): 189!#$%'()*

55 

56 class Item(SQLModel, table=True): 189!#$%'()*

57 id: Optional[int] = Field( 189!#$%'()*

58 default=None, 

59 primary_key=True, 

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

61 ) 

62 

63 

64def test_sa_column_no_nullable() -> None: 1abcdefghij

65 with pytest.raises(RuntimeError): 1+,-./:;=?@

66 

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

68 id: Optional[int] = Field( 1+,-./:;=?@

69 default=None, 

70 nullable=True, 

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

72 ) 

73 

74 

75def test_sa_column_no_foreign_key() -> None: 1abcdefghij

76 with pytest.raises(RuntimeError): 1klmnopqrst

77 

78 class Team(SQLModel, table=True): 1klmnopqrst

79 id: Optional[int] = Field(default=None, primary_key=True) 1klmnopqrst

80 name: str 1klmnopqrst

81 

82 class Hero(SQLModel, table=True): 1klmnopqrst

83 id: Optional[int] = Field(default=None, primary_key=True) 1klmnopqrst

84 team_id: Optional[int] = Field( 1klmnopqrst

85 default=None, 

86 foreign_key="team.id", 

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

88 ) 

89 

90 

91def test_sa_column_no_unique() -> None: 1abcdefghij

92 with pytest.raises(RuntimeError): 2[ ] ^ _ ` { | } ~ ab

93 

94 class Item(SQLModel, table=True): 2[ ] ^ _ ` { | } ~ ab

95 id: Optional[int] = Field( 2[ ] ^ _ ` { | } ~ ab

96 default=None, 

97 unique=True, 

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

99 ) 

100 

101 

102def test_sa_column_no_index() -> None: 1abcdefghij

103 with pytest.raises(RuntimeError): 2bbcbdbebfbgbhbibjbkb

104 

105 class Item(SQLModel, table=True): 2bbcbdbebfbgbhbibjbkb

106 id: Optional[int] = Field( 2bbcbdbebfbgbhbibjbkb

107 default=None, 

108 index=True, 

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

110 ) 

111 

112 

113def test_sa_column_no_ondelete() -> None: 1abcdefghij

114 with pytest.raises(RuntimeError): 2lbmbnbobpbqbrbsbtbub

115 

116 class Item(SQLModel, table=True): 2lbmbnbobpbqbrbsbtbub

117 id: Optional[int] = Field( 2lbmbnbobpbqbrbsbtbub

118 default=None, 

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

120 ondelete="CASCADE", 

121 )