sql >> データベース >  >> RDS >> PostgreSQL

ENUM値のPostgreSQL配列の保存

    1.3.17以降、回避策は不要になりました

    以下の回答は、ドキュメントにとして表示されました。 ENUMの配列 。このドキュメントページには次のように書かれています:

    歴史的な目的のための古い答え:

    Issue3467 を見ました Wichert Akkermanによって投稿され、この回避策が投稿されました。マイク・ベイヤーの功績。コードで次のクラスを宣言します(もちろん、必要なインポートを使用して):

    from sqlalchemy.dialects.postgresql import ARRAY
    from sqlalchemy import cast
    
    class ArrayOfEnum(ARRAY):
        def bind_expression(self, bindvalue):
            return cast(bindvalue, self)
    
        def result_processor(self, dialect, coltype):
            super_rp = super(ArrayOfEnum, self).result_processor(dialect, coltype)
    
            def handle_raw_string(value):
                if value==None:
                    return []
                inner = re.match(r"^{(.*)}$", value).group(1)
                return inner.split(",")
    
            def process(value):
                return super_rp(handle_raw_string(value))
            return process
    

    ArrayOfEnum は、モデル定義で使用される特別な列タイプになりました。

    だから代わりに

    class Judge(db.Model):
        statuses = db.Column(ARRAY(status))
    

    今、あなたはできる:

    class Judge(db.Model):
        statuses = db.Column(ArrayOfEnum(status))
    

    これで、コードでstatusesに値を割り当てることができます リストを使用すると、保存時に適切なキャストが行われます:

    my_judge_object.status = ['unmoderated', 'nominee']
    



    1. ノード内のバイナリとの間でUUIDを変換する

    2. SqlException(0x80131904):無効なオブジェクト名'dbo.Categories'

    3. 外部キーを使用して2つのテーブルからすべてのデータを取得する方法

    4. 選択したMySQLワイルドカード