2

所以我对倭黑猩猩有点陌生,我想弄清楚。我对 python 也有点陌生,所以这个项目有点吓人。我正在尝试将 mysql(使用 SQLAlchemy 作为服务)输入流转换为 XML 输出。我已经成功地设置了我的数据库流,但是对于如何创建一个将迭代我的选择结果的转换,我有点迷茫。有人知道这方面的一些例子吗?

官方示例只是调用内置的编写器函数(CsvWriter 等)。我需要写一个能写出 XML 的东西。我已经查看了内置倭黑猩猩编写器功能的内部代码,但我仍然对如何编写自己的编写器感到困惑。有谁知道对于初学者来说足够简单的自定义编写器的一些示例。

或者也许可以编写一个非常简单的示例的快速示例来迭代查询的结果?

我在用

bonobo_sqlalchemy.Select('SELECT * FROM UserData') 

作为我链中的第一次转换,我已经能够漂亮地打印我选择的结果......所以这是有效的。我只需要一个迭代集合的示例转换。

4

1 回答 1

2

实现您所描述的最简单方法是使用上下文处理器。

import bonobo


def xml_document(self, context):
    context.send('<document>')
    yield
    context.send('</document>')


@bonobo.config.use_context_processor(xml_document)
def make_me_an_xml(id, name):
    yield '  <id>{id}</id><name>{name}</name>'.format(id=id, name=name)


def get_graph(**options):
    graph = bonobo.Graph(
        [{
            'id': 1,
            'name': 'Jane'
        }, {
            'id': 2,
            'name': 'John'
        }], bonobo.UnpackItems(0), bonobo.OrderFields(['id', 'name']), make_me_an_xml, print
    )
    return graph


if __name__ == '__main__':
    with bonobo.parse_args() as options:
        bonobo.run(get_graph(**options))

您不能直接在函数中执行此操作的原因是 bonobo 中的节点使用每输入行调用一次的逻辑,并且(默认情况下)不知道整个执行上下文。

它允许保持转换函数无状态。但是你确实可以用 bonobo 理解的工作长度逻辑来装饰。

请注意,此 API 可能会在未来发展,因为它并不完全令人满意。

如果你真的需要在行级转换中使用上下文,你也可以用@bonobo.config.use_context装饰器来装饰你的转换。

希望有帮助。

于 2018-05-29T07:31:23.710 回答