【发布时间】:2012-03-20 05:33:30
【问题描述】:
所以在我的 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))
我知道上面的“枚举”不正确。
对于从数据库返回的该数组列的值的示例,我已在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 的正确转换。
我在这里发帖以防我错过了一个明显的先例?
【问题讨论】:
标签: python arrays postgresql sqlalchemy psycopg2