2016-08-03 4 views
0

私のpostgres dbテーブルの特定のカラムに非ASCII文字列が書き込まれないようにします。私はconstrainsを使用することを考えましたが、エンコード変換機能のいずれかを使用しようとするとエラーメッセージが表示されます。 lowerまたはbtrimのような他の文字列関数を使用すると問題は発生しませんでした。非ASCII文字列がカラムに書き込まれないようにする

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)  

エラーメッセージは次のとおりです。

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

のPostgreSQLにはutf8_to_ascii(text)機能がありません(エラーメッセージの状態などが;)):

(ProgrammingError) function utf8_to_ascii(text) does not exist

これは私のPostgreSQLのバージョンです。この名前の: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') 
+0

感謝を:代わりに(https://www.postgresql.org/docs/current/static/sql-createconversion.html変換の詳細)の変換が定義されます!しかし、次のエラーが発生します。 '(ProgrammingError)function convert(text、unknown、unknown)は存在しません。 ヒント:指定された名前と引数の型に一致する関数はありません。明示的な型キャストを追加する必要があるかもしれません。 – Framester

+1

私は答えを更新しました。 –

+0

'(ProgrammingError)関数convert(text、name、name)が存在しません。 ヒント:指定された名前と引数の型に一致する関数はありません。明示的な型キャストを追加する必要があるかもしれません。また、私はこのウェブサイトでutf6_to_asciiを見つけました:https://www.postgresql.org/docs/current/static/functions-string.html – Framester

関連する問題