Итак, в моей базе данных postgres у меня есть следующий настраиваемый тип:
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 [];
Я хотел бы отобразить это с 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))
Я знаю, что "Enum" неверен в приведенном выше.
В качестве примера значения, возвращаемого из базы данных для этого столбца массива, я показал ниже значение в 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
Итак, приведенное выше функция процесса
неправильно разделяет строку, предполагая, что это уже список.
До сих пор я успешно создал подклассы ARRAY, чтобы правильно разделить строку, и вместо Enum я попытался написать свой собственный тип (реализующий Unicode), чтобы воссоздать (строка, timedelta, integer)
, но столкнулись с множеством трудностей, в частности с правильным преобразованием интервала
в Python timedelta
.
Я пишу здесь на случай, если мне не хватает очевидного прецедентного способа сделать это?