sqlalchemy / sqlalchemy/alembic

Rendering postgresql dialect DOMAIN field

Open
#1,360 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

autogenerate - rendering bug open for pull requests postgresql
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 check constraint 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.