だから私のPostgresのDBに、私は次のカスタムタイプがあります。さらに物事を複雑にするSQLAlchemyの:PostgreSQLのカスタム型の配列
create type my_pg_type as (
sting_id varchar(32),
time_diff interval,
multiplier integer
);
を、これは配列として使用されている:
alter table my_table add column my_keys my_pg_type [];
IこれをSQLAlchemy(0.6.4)とマッピングしたい!
(エリクシルのための謝罪)
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.types import Enum
from elixir import Entity, Field
class MyTable(Entity):
# -- snip --
my_keys = Field(ARRAY(Enum))
私は '列挙型' は上記で間違っている知っています。そのアレイの列に戻って、データベースから来る値の例えば
、IはARRAY.result_processor(self, dialect, coltype)
に値以下に示すきた:
class ARRAY(sqltypes.MutableType, sqltypes.Concatenable, sqltypes.TypeEngine):
# -- snip --
def result_processor(self, dialect, coltype):
item_proc = self.item_type.result_processor(dialect, coltype)
if item_proc:
def convert_item(item):
if isinstance(item, list):
return [convert_item(child) for child in item]
else:
return item_proc(item)
else:
def convert_item(item):
if isinstance(item, list):
return [convert_item(child) for child in item]
else:
return item
def process(value):
if value is None:
return value
"""
# sample value:
>>> value
'{"(key_1,07:23:00,0)","(key_2,01:00:00,20)"}'
"""
return [convert_item(item) for item in value]
return process
そこで上記process
機能が誤ってそれはすでにだと仮定すると、文字列を分割リスト。
これまでは、文字列を正しく分割するためにARRAYをサブクラス化しましたが、Enumの代わりに(string, timedelta, integer)
タプルを再作成するために独自の型(Unicodeを実装)を作成しようとしましたが、特にinterval
をPython timedelta
に適切に変換することが困難です。
これを行うための明白な先例がない場合に備えて、ここに投稿していますか?
関連SQLAlchemyの問題は、私はここポスターは、この機能を追加するためにpsycopg2を取得するために管理していなかったと思います。https://bitbucket.org/zzzeek/sqlalchemy/issue/3467/array -of-enums-does-not-allow-assign-assigning – zzzeek