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
« prev ^ index » next coverage.py v7.13.0, created at 2026-06-10 09:40 +0000
1from typing import Annotated 1abcdefgh
3import pytest 1abcdefgh
4from sqlalchemy import Column, Integer, String 1abcdefgh
5from sqlmodel import Field, SQLModel 1abcdefgh
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 )
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
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 )
27 assert Item.id.nullable is False # type: ignore 1yzABCDEF
28 assert isinstance(Item.id.type, String) # type: ignore 1yzABCDEF
31def test_sa_column_no_sa_args() -> None: 1abcdefgh
32 with pytest.raises(RuntimeError): 1GHIJKLMN
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 )
42def test_sa_column_no_sa_kargs() -> None: 1abcdefgh
43 with pytest.raises(RuntimeError): 1OPQRSTUV
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 )
53def test_sa_column_no_type() -> None: 1abcdefgh
54 with pytest.raises(RuntimeError): 1WXYZ0123
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 )
64def test_sa_column_no_primary_key() -> None: 1abcdefgh
65 with pytest.raises(RuntimeError): 1456789!#
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 )
75def test_sa_column_no_nullable() -> None: 1abcdefgh
76 with pytest.raises(RuntimeError): 1$%'()*+,
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 )
86def test_sa_column_no_foreign_key() -> None: 1abcdefgh
87 with pytest.raises(RuntimeError): 1ijklmnop
89 class Team(SQLModel, table=True): 1ijklmnop
90 id: int | None = Field(default=None, primary_key=True) 1ijklmnop
91 name: str 1ijklmnop
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 )
102def test_sa_column_no_unique() -> None: 1abcdefgh
103 with pytest.raises(RuntimeError): 1-./:;=?@
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 )
113def test_sa_column_no_index() -> None: 1abcdefgh
114 with pytest.raises(RuntimeError): 1[]^_`{|}
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 )
124def test_sa_column_no_ondelete() -> None: 1abcdefgh
125 with pytest.raises(RuntimeError): 2~ abbbcbdbebfbgb
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 )