我在我的 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/