如何为每个方言生成不同的约束?

时间:2016-12-18 19:35:46

标签: postgresql sqlite sqlalchemy

SQLite和Postgres都可以使用CHECK约束验证我的文本,但它们使用不同的命令和/或不同的语法。

例如,我可以在SQLite中使用check length(trim(value, '0123456789abcdef')) = 0来验证值是小写十六进制,但Postgres需要类似length(trim('0123456789abcdef' from value)) = 0(或正则表达式)的内容。我有其他限制来验证值是电子邮件地址和FQDN。

如何(使用ORM声明语法)可以为SQLite和Postgres生成不同的CheckConstraints?不会为列调用_create_rule可调用,并且我没有运气将约束移动到表级别。

我是否需要创建自定义类型?

1 个答案:

答案 0 :(得分:0)

解决方案似乎是将CheckConstraints添加到__table_args__并使用_create_rule有选择地启用每个约束:

def is_sqlite(compiler):
    return compiler.dialect.name == 'sqlite'

def is_postgres(compiler):
    return compiler.dialect.name == 'postgresql'

class MyTable(Base):
    __table__ = 'mytable'
    __table_args__ = (
        CheckConstraint('length(trim(value, '0123456789abcdef')) = 0',
                        _create_rule=is_sqlite),
        CheckConstraint('length(trim('0123456789abcdef' from value))=0',
                        _create_rule=is_postgres),
    )

    value = Column(String)