从MySQL读取后需要帮助编写一个bonobo XML编写器转换(SQLAlchemy)

时间:2018-05-28 07:02:12

标签: python mysql xml etl bonobo-etl

所以我对倭黑猩猩来说有点新,我想弄清楚。我也是python的新手,所以这个项目有点令人生畏。我试图将mysql(使用SQLAlchemy作为服务)输入流转换为XML输出。我已经成功设置了我的数据库流,但是我对如何创建一个迭代我的select结果的转换感到很遗憾。有人知道这方面的一些例子吗?

官方的例子只是调用内置的编写器函数(CsvWriter等)。我需要写一个会写出XML的。我已经查看了bonobo writer函数构建的内部代码,但我仍然对如何编写自己的编写器感到困惑。有没有人知道自定义编写器的一些例子,这对初学者来说足够简单。

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

我正在使用

bonobo_sqlalchemy.Select('SELECT * FROM UserData') 

作为我在我的链条中的第一次转换,我已经能够将我的选择结果打印出来......这样才有效。我只需要一个迭代集合的示例转换。

1 个答案:

答案 0 :(得分: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装饰器修饰转换。

希望有所帮助。