¿Cómo representar un dominio PostgreSQL personalizado en SQLAlchemy?

Estoy empezando a incorporar Alembic en mi proyecto, que ya usa las definiciones de la tabla SQLAlchemy. Actualmente, mi esquema de base de datos se administra de forma externa a mi aplicación, y quiero incluir todo el esquema en mi archivo de definiciones de tabla.

En PostgreSQL utilizo un dominio personalizado para almacenar direcciones de correo electrónico. El DDL de PostgreSQL es:

CREATE DOMAIN email_address TEXT CHECK (value ~ '.+@.+') 

¿Cómo represento la creación de este dominio y su uso como tipo de datos de columna en SQLAlchemy?

Probablemente esté lejos de ser una solución operativa, pero creo que la mejor manera de hacerlo sería la subclase sqlalchemy.schema._CreateDropBase .

 from sqlalchemy.schema import _CreateDropBase class CreateDomain(_CreateDropBase): '''Represent a CREATE DOMAIN statement.''' __visit_name__ = 'create_domain' def __init__(self, element, bind=None, **kw): super(CreateDomain, self).__init__(element, bind=bind, **kw) class DropDomain(_CreateDropBase): '''Represent a DROP BASE statement.''' __visit_name__ = 'drop_domain' def __init__(self, element, bind=None, **kw): super(DropDomain, self).__init__(element, bind=bind, **kw) @compiles(CreateDomain, 'postgresql') def visit_create_domain(element, compiler, **kw): text = '\nCREATE DOMAIN %s AS %s' % ( compiler.prepare.format_column(element.name), compiler.preparer.format_column(element.type_)) # doesn't account for arrays and such I don't think default = compiler.get_column_default_string(column) if default is not None: text += " DEFAULT %s" % default return text 

Obviamente, esto está incompleto, pero debería darle un buen punto de partida si lo desea lo suficiente. 🙂