Coverage for tests / test_field_sa_column.py: 100%
54 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-11-09 00:02 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2026-11-09 00:02 +0000
1from typing import Annotated 1abcdefghi
3import pytest 1abcdefghi
4from sqlalchemy import Column, Integer, String 1abcdefghi
5from sqlmodel import Field, SQLModel 1abcdefghi
8def test_sa_column_takes_precedence() -> None: 1abcdefghi
9 class Item(SQLModel, table=True): 1stuvwxyzA
10 id: int | None = Field( 1stuvwxyzA
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 1stuvwxyzA
17 assert isinstance(Item.id.type, String) # type: ignore 1stuvwxyzA
20def test_sa_column_with_annotated_metadata() -> None: 1abcdefghi
21 class Item(SQLModel, table=True): 1BCDEFGHIJ
22 id: Annotated[int | None, "meta"] = Field( 1BCDEFGHIJ
23 default=None,
24 sa_column=Column(String, primary_key=True, nullable=False),
25 )
27 assert Item.id.nullable is False # type: ignore 1BCDEFGHIJ
28 assert isinstance(Item.id.type, String) # type: ignore 1BCDEFGHIJ
31def test_sa_column_no_sa_args() -> None: 1abcdefghi
32 with pytest.raises(RuntimeError): 1KLMNOPQRS
34 class Item(SQLModel, table=True): 1KLMNOPQRS
35 id: int | None = Field( 1KLMNOPQRS
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: 1abcdefghi
43 with pytest.raises(RuntimeError): 1TUVWXYZ01
45 class Item(SQLModel, table=True): 1TUVWXYZ01
46 id: int | None = Field( 1TUVWXYZ01
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: 1abcdefghi
54 with pytest.raises(RuntimeError): 123456789!
56 class Item(SQLModel, table=True): 123456789!
57 id: int | None = Field( 123456789!
58 default=None,
59 sa_type=Integer,
60 sa_column=Column(Integer, primary_key=True),
61 )
64def test_sa_column_no_primary_key() -> None: 1abcdefghi
65 with pytest.raises(RuntimeError): 1#$%'()*+,
67 class Item(SQLModel, table=True): 1#$%'()*+,
68 id: int | None = Field( 1#$%'()*+,
69 default=None,
70 primary_key=True,
71 sa_column=Column(Integer, primary_key=True),
72 )
75def test_sa_column_no_nullable() -> None: 1abcdefghi
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: 1abcdefghi
87 with pytest.raises(RuntimeError): 1jklmnopqr
89 class Team(SQLModel, table=True): 1jklmnopqr
90 id: int | None = Field(default=None, primary_key=True) 1jklmnopqr
91 name: str 1jklmnopqr
93 class Hero(SQLModel, table=True): 1jklmnopqr
94 id: int | None = Field(default=None, primary_key=True) 1jklmnopqr
95 team_id: int | None = Field( 1jklmnopqr
96 default=None,
97 foreign_key="team.id",
98 sa_column=Column(Integer, primary_key=True),
99 )
102def test_sa_column_no_unique() -> None: 1abcdefghi
103 with pytest.raises(RuntimeError): 2] ^ _ ` { | } ~ ab
105 class Item(SQLModel, table=True): 2] ^ _ ` { | } ~ ab
106 id: int | None = Field( 2] ^ _ ` { | } ~ ab
107 default=None,
108 unique=True,
109 sa_column=Column(Integer, primary_key=True),
110 )
113def test_sa_column_no_index() -> None: 1abcdefghi
114 with pytest.raises(RuntimeError): 2bbcbdbebfbgbhbibjb
116 class Item(SQLModel, table=True): 2bbcbdbebfbgbhbibjb
117 id: int | None = Field( 2bbcbdbebfbgbhbibjb
118 default=None,
119 index=True,
120 sa_column=Column(Integer, primary_key=True),
121 )
124def test_sa_column_no_ondelete() -> None: 1abcdefghi
125 with pytest.raises(RuntimeError): 2kblbmbnbobpbqbrbsb
127 class Item(SQLModel, table=True): 2kblbmbnbobpbqbrbsb
128 id: int | None = Field( 2kblbmbnbobpbqbrbsb
129 default=None,
130 sa_column=Column(Integer, primary_key=True),
131 ondelete="CASCADE",
132 )