SQLAlchemy TypeDecorator не работает


Я использую xml в моей базе данных postgresql, и мне нужен пользовательский тип, который мог бы обрабатывать данные xml в SQLAlchemy.

Поэтому я сделал 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, очевидно, что что связывающий процессор не работает правильно, но я думаю, что я реализовал это правильно, поэтому я не знаю, что я должен сделать, чтобы изменить ситуацию.

process_bind_param дает мне ту же ошибку.

Где я ошибся в своем коде?

1 5

1 ответ:

ElementTree.dump() функция сбрасывает XML в поток (stdout по умолчанию) и возвращает None. Используйте ElementTree.tostring() или сбросьте его в объект StringIO.