sqlalchemy / alembic

A database migrations tool for SQLAlchemy.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Rendering postgresql dialect DOMAIN field

ovangle opened this issue · comments

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!

I'm not 100% sure the issue here is in the alembic side or in sqlalchemy (since the type is defined there). At worst we can move the issue to the other repo.

Care to try sending a PR?