如何在Sqlalchemy中设置用户定义类型

7 投票
1 回答
11839 浏览
提问于 2025-04-18 16:03

目前我正在尝试使用Sqlalchemy从一个给定的数据库中获取数据。到现在为止,这个过程对我来说一直很顺利。不过,现在我需要读取这个表

create table DISPLAYOPTIONS (
  DOID integer constraint DO_PK primary key 
        USING INDEX (create index DO_PK_IX on DISPLAYOPTIONS(DOID) ),
  OPT dispopt
);

其中 dispopt 是一个自定义类型,定义如下

CREATE OR REPLACE TYPE DISPOPT AS OBJECT (
  LABEL_X varchar2(50),
  LABEL_Y varchar2(50),
  LABEL_Z varchar2(50)
);

那么,如何在Sqlalchemy中定义自定义类型呢?我在文档中找到了这个信息,

http://docs.sqlalchemy.org/en/rel_0_9/core/types.html#creating-new-types

这是一个合适的起点吗?你知道一些与我面临的问题相近的例子吗?

非常感谢,祝好,


我现在尝试过的内容: 我在Stackoverflow上找到了这个:

如何使用SQLAlchemy声明式创建复合列?

并链接到文档:

http://docs.sqlalchemy.org/en/latest/orm/mapper_config.html#composite-column-types

然后我设置了:

class DISPOPT(object):
    def __init__(self, LABEL_X, LABEL_Y, LABEL_Z):
        self.LABEL_X = LABEL_X
        self.LABEL_Y = LABEL_Y
        self.LABEL_Z = LABEL_Z 

    def __composite_values__(self):
        return self.LABEL_X, self.LABEL_Y, self.LABEL_Z

class DISPLAYOPTIONS(Base):
    __tablename__ = "DISPLAYOPTIONS"

    DOID = Column(Integer, primary_key = True)

    OPT = composite(
        DISPOPT,
        Column('LABEL_X', String(50)),
    Column('LABEL_Y', String(50)),
    Column('LABEL_Z', String(50)) 
)

但是我仍然收到了来自数据库的错误信息。

1 个回答

3

解决办法是参考以下内容:

http://docs.sqlalchemy.org/en/rel_0_9/core/custom_types.html#creating-new-types

或者可以看看书《Essential SQLAlchemy》的第65页,里面介绍了如何使用 UserDefinedType 这个类来实现。

撰写回答