如何在SQLAlchemy中表示自定义PostgreSQL域?

我开始将Alembic合并到我已经使用sqlAlchemy表定义的项目中.目前我的数据库架构是在我的应用程序外部管理的,我想将整个架构带入我的表定义文件中.

在Postgresql中,我使用自定义域来存储电子邮件地址. Postgresql DDL是:

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

如何在sqlAlchemy中表示此域的创建及其作为列数据类型的用法

这可能远不是一个有效的解决方案,但我认为最好的方法是子类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,**kw):
        super(DropDomain,**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

显然,这是不完整的,但如果你想要这么做的话,它应该给你一个很好的起点.

相关文章

来源:http://www.postgres.cn/docs/11/ 4.1.1. 标识符和关键词 SQL标识符和关键词必须以一个...
来源:http://www.postgres.cn/docs/11/ 8.1. 数字类型 数字类型由2、4或8字节的整数以及4或8...
来源:http://www.postgres.cn/docs/11/ 5.1. 表基础 SQL并不保证表中行的顺序。当一个表被读...
来源:http://www.postgres.cn/docs/11/ 6.4. 从修改的行中返回数据 有时在修改行的操作过程中...
来源:http://www.postgres.cn/docs/11/ 13.2.1. 读已提交隔离级别 读已提交是PostgreSQL中的...
来源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三种独立的实现模式匹...