SnapLogic Python для чтения и выполнения файла SQL - PullRequest
0 голосов
/ 22 октября 2018

У меня есть простой файл SQL, который я хотел бы прочитать и выполнить с помощью Python Script Snap в SnapLogic.Я создал файл библиотеки выражений для ссылки на учетную запись Redshift и включил его в качестве параметра в конвейер.

У меня есть код ниже из другого поста.Есть ли способ ссылки на параметр конвейера для подключения к базе данных Redshift, чтения загруженного файла SQL и выполнения команд?

fd = open('shared/PythonExecuteTest.sql', 'r')
sqlFile = fd.read()
fd.close()

sqlCommands = sqlFile.split(';')

for command in sqlCommands:
    try:
        c.execute(command)
    except OperationalError, msg:
        print "Command skipped: ", msg

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете получить доступ к параметрам конвейера в скриптах, используя $_.

Допустим, у вас есть параметр конвейера executionId.Затем для доступа к нему в скрипте вы можете выполнить $_executionId.

. Ниже приведен тестовый конвейер.

pipeline

со следующимпараметр трубопровода.

Pipeline parameter

Ниже приведены данные испытаний.

test data

Ниже приведен сценарий

# Import the interface required by the Script snap.
from com.snaplogic.scripting.language import ScriptHook
import java.util

class TransformScript(ScriptHook):
    def __init__(self, input, output, error, log):
        self.input = input
        self.output = output
        self.error = error
        self.log = log

    # The "execute()" method is called once when the pipeline is started
    # and allowed to process its inputs or just send data to its outputs.
    def execute(self):
        self.log.info("Executing Transform script")
        while self.input.hasNext():
            try:
                # Read the next document, wrap it in a map and write out the wrapper
                in_doc = self.input.next()
                wrapper = java.util.HashMap()
                wrapper['output'] = in_doc
                wrapper['output']['executionId'] = $_executionId

                self.output.write(in_doc, wrapper)
            except Exception as e:
                errWrapper = {
                    'errMsg' : str(e.args)
                }
                self.log.error("Error in python script")
                self.error.write(errWrapper)

        self.log.info("Finished executing the Transform script")

# The Script Snap will look for a ScriptHook object in the "hook"
# variable.  The snap will then call the hook's "execute" method.
hook = TransformScript(input, output, error, log)

Вывод:

output

Здесь вы можете видеть, что executionId был прочитан изпараметры конвейера.

Примечание: Доступ к параметрам конвейера из сценариев является допустимым сценарием, но доступ к другим внешним системам из сценария является сложным (поскольку вам необходимо загрузить необходимые библиотеки), а нерекомендуемые.Используйте оснастки, предоставленные SnapLogic, для доступа к внешним системам.Кроме того, если вы хотите использовать другие библиотеки внутри скриптов, попробуйте придерживаться Javascript вместо того, чтобы переходить на python, потому что есть много CDN с открытым исходным кодом, которые вы можете использовать в своих скриптах.

Кроме того, вы не можетеполучить доступ к любой настроенной библиотеке выражений прямо из скрипта.Если вам нужна логика в сценарии, вы должны оставить ее в сценарии, а не где-то еще.И нет никакого смысла в доступе к именам учетных записей в сценарии (или средствах сопоставления), потому что, даже если вы знаете имя учетной записи, вы не можете использовать учетные данные / конфигурации, хранящиеся в этой учетной записи напрямую;это обрабатывается SnapLogic.Максимально используйте предоставленные привязки и сопоставления.


Обновление # 1

  • Вы не можете получить доступ к учетной записи напрямую.Счета управляются и используются внутри оснастки.Вы можете создавать и настраивать учетные записи только через вкладку учетных записей соответствующей привязки.
  • Старайтесь не использовать привязку сценария в максимально возможной степени;особенно, если вы можете сделать то же самое, используя обычные привязки.

Обновление # 2

Самое простое решение этого требования будет следующим.

  • Чтение файла с помощью программы чтения файлов
  • Разделение на основе ;
  • Выполнение каждой команды SQL с использованием универсального JDBC-выполнения Snap
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...