그래서 내 포스트 그레스 DB에서 나는 다음과 같은 사용자 정의 유형이 있습니다SqlAlchem y의 : PostgreSQL의 사용자 정의 형식의 배열
alter table my_table add column my_keys my_pg_type [];
I : 더 일을 복잡하게
create type my_pg_type as (
sting_id varchar(32),
time_diff interval,
multiplier integer
);
,이 배열로 사용됩니다 이걸 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))
내가 '열거'을 알고 위의 올바르지 않습니다. 해당 배열 컬럼에 대한 데이터베이스에서 돌아 오는 값의 예를 들어
, 나는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)
튜플을 다시 만들려고했으나 많이 실행되었습니다. 특히 interval
을 Python timedelta
으로 올바르게 변환하는 데 어려움이 있습니다.
이렇게하는 명백한 선례가없는 경우를 대비하여 여기에 게시하고 있습니까?
관련 SQLAlchemy의 문제, 나는 포스터가 여기에이 기능을 추가 할 수 psycopg2을 얻을 관리하지 않은 것 같아요 : https://bitbucket.org/zzzeek/sqlalchemy/issue/3467/array -of-enums-does-allow-assign-assigning – zzzeek