xml - SQLAlchemy TypeDecorator 不起作用

标签 xml postgresql sqlalchemy elementtree

我在我的 postgresql 数据库中使用 xml,我需要一个自定义类型来处理 SQLAlchemy 中的 xml 数据。

所以我制作了 XMLType 类与 xml.etree 进行通信,但它并没有像我希望的那样工作。

这是我写的代码:

import xml.etree.ElementTree as etree

class XMLType(sqlalchemy.types.TypeDecorator):

    impl = sqlalchemy.types.UnicodeText
    type = etree.Element

    def get_col_spec(self):
        return 'xml'

    def bind_processor(self, dialect):
        def process(value):
            if value is not None:
                return etree.dump(value)
            else:
                return None
        return process

    def process_result_value(self, value, dialect):
        if value is not None:
            value = etree.fromstring(value)
        return value

它在检索值和结果处理方面效果很好。但是当我试图插入一行时,我得到一个错误(当然,我把 body 作为 xml.etree.ElementTree.Element 对象):

IntegrityError: (IntegrityError) null value in column "body" violates not-null 
constraint "INSERT INTO comments (id, author_id, look_id, body, created_at) 
VALUES (nextval('object_seq'), %(author_id)s, %(look_id)s, %(body)s, now()) 
RETURNING comments.id" {'body': None, 'author_id': 1550L, 'look_id': 83293L}

看到 body 值为 None,很明显绑定(bind)处理器不能正常工作,但我认为我正确地实现了它,所以我不知道是什么我应该怎么做才能改变这种情况。

process_bind_param 给我同样的错误。

我的代码哪里出错了?

最佳答案

ElementTree.dump() 函数将 XML 转储到流(默认为标准输出)并返回 None。使用 ElementTree.tostring() 或将其转储到 StringIO 对象。

关于xml - SQLAlchemy TypeDecorator 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8530858/

相关文章:

python - 模型内的 Pyramid 事件

html - 在 R 中进行网络抓取时如何修复 HTTP 403 错误?

java - 将 java 从 1.8.0_77 更新到 1.8.0_121 后,JAXB 不会解码

sql - 使用 COPY 将 .json 文件导入 PostgreSQL 表

python - 如何修复我在 vanilla SQLAlchemy 和 Flask-SQLAlchemy 中使用相同模型的方法?

python - SQLAlchemy:相同的表但不同的数据库引擎

java - 关于 fragment 的类膨胀错误

Python XML 解析器

postgresql - 如何创建触发器,使整个旧记录(现有表)在现有表中发生更新之前转到另一个表

postgresql - sql : converting argument $1 type: unsupported type []int, 中的一片