防止将非ASCII字符串写入Column

时间:2016-08-03 16:04:12

标签: postgresql unicode sqlalchemy

我想防止将非ASCII字符串写入postgres db表中的特定列。我想过使用constrains,但在尝试使用任何编码转换函数时收到错误消息。使用其他字符串函数(如lowerbtrim)没有问题。

metadata = MetaData()
constrains = [CheckConstraint('lower(name) = name', name='enforce_lower'),
            CheckConstraint('utf8_to_ascii(name) = name', name='prevent_non_ascii')]
concepts_table = Table('test20', metadata,
                       Column('name', Text, *constrains))
metadata.create_all(engine, checkfirst=False)    

错误消息是:

(ProgrammingError) function utf8_to_ascii(text) does not exist

这是我的postgresql版本:

SELECT version();
PostgreSQL 9.5.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16), 64-bit

1 个答案:

答案 0 :(得分:2)

postgresql中没有utf8_to_ascii(text)函数(作为错误消息状态;))。而是定义了此名称的转化(更多关于转化:https://www.postgresql.org/docs/current/static/sql-createconversion.html):https://www.postgresql.org/docs/current/static/functions-string.html#CONVERSION-NAMES

要利用现有转换,请使用convert(string bytea, src_encoding name, dest_encoding name)

尝试使用以下约束定义:

CheckConstraint("encode(convert(name::bytea, 'UTF8'::name, 'SQL_ASCII'::name), 'escape') = name", name='prevent_non_ascii')