Skip to content

Commit c2927b2

Browse files
🐛 FIX: Exception when rendering CheckConstraints (#19)
Co-authored-by: Chris Sewell <chrisj_sewell@hotmail.com>
1 parent d6ca966 commit c2927b2

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

sphinx_sqlalchemy/main.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from sphinx.util.docutils import SphinxDirective
1212
from sqlalchemy import Column, Constraint, inspect
1313
from sqlalchemy.orm.mapper import Mapper
14+
from sqlalchemy.sql.elements import ClauseElement
1415
from sqlalchemy.sql.schema import (
1516
CheckConstraint,
1617
ForeignKeyConstraint,
@@ -169,6 +170,14 @@ def add_content(self, mapper: Mapper, definition: nodes.definition) -> None:
169170
definition[-1] += nodes.list_item("", nodes.paragraph(text=text))
170171

171172

173+
def check_constraint_to_str(constraint: CheckConstraint) -> str:
174+
if isinstance(constraint.sqltext, ClauseElement):
175+
text = constraint.sqltext.compile(compile_kwargs={"literal_binds": True})
176+
else:
177+
text = getattr(constraint.sqltext, "text", "")
178+
return f"CHECK ({text})"
179+
180+
172181
def contraint_to_str(constraint: Constraint) -> str:
173182
"""Convert a constraint to a string."""
174183
if isinstance(constraint, PrimaryKeyConstraint):
@@ -182,7 +191,7 @@ def contraint_to_str(constraint: Constraint) -> str:
182191
if isinstance(constraint, UniqueConstraint):
183192
return f"UNIQUE ({', '.join(c.name for c in constraint.columns)})"
184193
if isinstance(constraint, CheckConstraint):
185-
return f"CHECK ({constraint.sqltext.text})" # type: ignore
194+
return check_constraint_to_str(constraint)
186195
return "UNKNOWN"
187196

188197

tests/__snapshots__/test_basic.ambr

+3
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@
6767
<rubric>
6868
Constraints:
6969
<bullet_list>
70+
<list_item>
71+
<paragraph>
72+
CHECK (length(trim('first_name')) > 0)
7073
<list_item>
7174
<paragraph>
7275
PRIMARY KEY (pk)

tests/modules/module1.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlalchemy import Column, UniqueConstraint, orm, types
1+
from sqlalchemy import CheckConstraint, Column, UniqueConstraint, func, orm, types
22

33
Base = orm.declarative_base()
44

@@ -7,7 +7,12 @@ class TestUser(Base):
77
"""A ``user``."""
88

99
__tablename__ = "dbusers"
10-
__table_args__ = (UniqueConstraint("first_name", "last_name"),)
10+
__table_args__ = (
11+
UniqueConstraint("first_name", "last_name"),
12+
CheckConstraint(
13+
func.length(func.trim("first_name")) > 0, "check_project_has_name"
14+
),
15+
)
1116
pk = Column(types.Integer, primary_key=True)
1217
first_name = Column(types.String, doc="The name of the user.")
1318
last_name = Column(types.String(255), doc="The surname of the user.")

0 commit comments

Comments
 (0)