SQLite和Postgres都可以使用CHECK约束验证我的文本,但它们使用不同的命令和/或不同的语法。
例如,我可以在SQLite中使用check length(trim(value, '0123456789abcdef')) = 0
来验证值是小写十六进制,但Postgres需要类似length(trim('0123456789abcdef' from value)) = 0
(或正则表达式)的内容。我有其他限制来验证值是电子邮件地址和FQDN。
如何(使用ORM声明语法)可以为SQLite和Postgres生成不同的CheckConstraints?不会为列调用_create_rule可调用,并且我没有运气将约束移动到表级别。
我是否需要创建自定义类型?
答案 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)