Так что в моем Postgres БД у меня есть следующий пользовательский тип: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 'd хотел бы сопоставить это с 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
Так выше process
функции неправильно разбивает строку, предполагая, что это уже список.
До сих пор я успешно подклассифицировал ARRAY, чтобы правильно разделить строку, а вместо Enum я попытался написать свой собственный тип (реализующий Unicode), чтобы воссоздать кортеж (string, timedelta, integer)
, но столкнулся с большим количеством трудности, в частности правильное преобразование interval
в Python timedelta
.
Я отправляю здесь, если у меня отсутствует очевидный прецедентный способ сделать это?
отношение SQLAlchemy вопрос, я думаю, плакат здесь не удалось получить psycopg2 добавить эту функцию: https://bitbucket.org/zzzeek/sqlalchemy/issue/3467/array -of-enums-does-not-allow-assigning – zzzeek