sqlalchemy / sqlalchemy/alembic
Rendering postgresql dialect DOMAIN field
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 4.4k
- Forks
- 375
- PR merge metrics
- No merged PRs in 30d
Description
Describe the bug
I have the following postgres domain in my model
# adapted from html5 standard
# https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#basic_validation
_POSTGRES_EMAIL_RE = (
r"^"
r"[a-z0-9.!#$%&''*+/=?^_`{|}~-]+"
r"@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?"
r"(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*"
r"$"
)
EMAIL_DOMAIN = pg_dialect.DOMAIN(
'email',
pg_dialect.CITEXT(),
check=rf"value ~ '{_POSTGRES_EMAIL_RE}'"
)
class Base(DeclarativeBase):
pass
class Contact(Base):
__tablename__ = 'contacts'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
email: Mapped[str] = mapped_column(EMAIL_DOMAIN)
When autogenerating the field, the column corresponding to the email field is rendered as:
sa.Column('email', postgresql.DOMAIN('email', CITEXT()), nullable=False),
The rendered output is
- missing the
checkconstraint on the model column; and - not importing the data_type in the generated migration.
Expected behavior
The column should be rendered as
sa.Column('email', postgresql.DOMAIN('email', postgresql.CITEXT(), check=rf"value ~ '^my_.*$'"), nullable=False),
To Reproduce
Please try to provide a Minimal, Complete, and Verifiable example, with the migration script and/or the SQLAlchemy tables or models involved.
See also Reporting Bugs on the website.
# Insert code here
Error
# Copy error here. Please include the full stack trace.
Versions.
- OS: Ubuntu 22.04.3 LTS
- Python: 3.11.2
- Alembic: 1.12.0
- SQLAlchemy: 2.0.21
- Database: 15.4
- DBAPI: psycopg[c]==3.1.12
Additional context
Split from issue #1357
Have a nice day!
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start at Alembic's PostgreSQL autogenerate rendering path for DOMAIN types and its migration import collection, reproducing the model shown in the issue. Done means generated code preserves the DOMAIN check expression and emits the required postgresql.CITEXT import, matching the expected column.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- postgresql, python
- Domain
- database, tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100