Нужна помощь в написании преобразования bonobo XML Writer после чтения из MySQL (SQLAlchemy) - PullRequest
0 голосов
/ 28 мая 2018

Так что я немного новичок в бонобо и пытаюсь понять это.Я также немного новичок в Python, так что этот проект был немного пугающим.Я пытаюсь преобразовать входной поток mysql (используя SQLAlchemy в качестве службы) в вывод XML.Я успешно настроил поток своей базы данных, но я немного растерялся, как создать преобразование, которое будет повторять результат моего выбора.Кто-нибудь знает некоторые примеры этого?

Официальные примеры - это просто вызов встроенных функций записи (CsvWriter и т. Д.).Мне нужно написать тот, который будет записывать XML.Я посмотрел на внутренний код для сборки в функциях пишущего бонобо, но я все еще не уверен, как написать свой собственный писатель.Кто-нибудь знает некоторые примеры пользовательских писателей, которые достаточно просты для начинающего.

Или, может быть, может написать быстрый пример ОЧЕНЬ простого примера, который повторяет результаты запроса?

Я использую

bonobo_sqlalchemy.Select('SELECT * FROM UserData') 

в качестве своего первого преобразования в моей цепочке, и я смог распечатать результаты моего выбора ... так что это работает.Мне просто нужен пример преобразования, которое перебирает коллекцию.

1 Ответ

0 голосов
/ 29 мая 2018

Самый простой способ добиться того, что вы описываете, - это использовать контекстный процессор.

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.

Обратите внимание, что этот API, вероятно, будет развиваться в будущем, поскольку он не вполне удовлетворителен.

Если вам действительно нужно использоватьВ контексте преобразования уровня строки вы также можете украсить преобразование с помощью декоратора @bonobo.config.use_context.

Надеюсь, это поможет.

...