использование python в SQL Server 2017 для вызова API и хранения данных - PullRequest
0 голосов
/ 22 декабря 2018

Я работал над своим набором навыков в Python, чтобы вызывать RestAPIs, возвращать / анализировать json и сохранять результаты.В конечном итоге моей конечной целью было бы создание программ для доставки наших данных в наше хранилище данных.

Я дошел до возможности вызывать API и сохранять данные в CSV, и я могу открыть соединение с базой данных и выполнить инструкцию SQL и напечатать результат, но это мой пробел.

Теперь, когда SQL Server 2017 имеет возможность запускать скрипты Python в SSMS и создавать хранимые процедуры, я надеялся, что смогу устранить пробел в SQL и вызвать API-интерфейсы, использующие Python, вернуть данные, а затем использовать SQL дляпроверить и добавить данные в правильные таблицы.

Единственные примеры сценариев, которые я видел для Python в SQL Server, предназначены для анализа данных, уже находящихся в SQL Server, а не для хранения данных в SQL.

Это то, что я имею до сих пор.

Какие пакеты Python мне нужны, и как мне вставить операторы SQL / переменные SQL в скрипт Python для использования?

    --Python Version
execute sp_execute_external_script 
@language = N'Python',
@script = N'

import sys
import codecs
import requests
import json

locations = select top(10) locationId from TestDb.locationstable

for j in range(locations):

    url = "http://example.com/api/location/" + locations[j]+ "/users"
    querystring = {"pretty":"1"}
    headers = {"Api-Key": ""}
    r = requests.request("GET", url, headers=headers, params=querystring)
    d = r.json()
    status = d["status"]
    responseData = d["data"]["Users"]
    print(status)
    print(responseData)

Часть Python работает в SQL Server, когда я беру цикл и жесткий код для одного местоположения в скрипте, но не уверен, как получить переменную местоположений, ссылающуюся на список данных из выбора.заявление для работы в скрипте Python.

И затем, как бы я что-то сделал с возвращенными данными ответа, если они возвращаются так:

STDOUT message(s) from external script: 
status: 200


STDOUT message(s) from external script: 
[{'id': '123', 'name': 'Sally'}, {'id': '124', 'name': 'Joe'}]

1 Ответ

0 голосов
/ 22 декабря 2018

Я не думаю, что действительно имеет смысл выполнять оператор SQL в скрипте Python, который уже находится в самом экземпляре SQL Server.Насколько я понимаю, преимущество возможности вызова Python из SQL Server заключается в том, что он позволяет получить доступ к некоторым функциям / преобразованиям аналитики, которые были бы невозможны в T-SQL.Логика должна быть следующей:

  1. Из скрипта T-SQL вызвать процедуру Python.При необходимости он может принимать переменные в качестве входных данных / аргументов, которые могут быть получены из предыдущего оператора SQL, выполненного непосредственно в вашей среде T-SQL.В вашем случае это означает, что вы можете зацикливаться на результатах запроса местоположений в T-SQL и вызывать свой скрипт Python после для каждой записи вашего запроса.
  2. Сценарий Python выполняет все и потенциально возвращает данные в качестве выводав ваш SQL-скрипт.
  3. SQL-скрипт получает выходные данные и продолжает свою работу.В вашем случае он может вставить данные, которые вы извлекли из запроса http, в нужную вам таблицу.

https://docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/run-python-using-t-sql?view=sql-server-2017

Сочетание сценария T-SQL и сценария Python кажетсянемного громоздко для меня.Лично я бы предложил использовать скрипт Python для сложных математических функций или автономных преобразований, которые вы не можете сделать в SQL.Для целей ETL (Извлечь и преобразовать) я бы предложил вам вывести свой скрипт Python за пределы сервера SQL и создать себе надлежащую среду Python, потенциально используя Docker.Если ваш сценарий находится за пределами SQL Server, существуют разные способы подключения и запроса к вашей БД.Я бы посоветовал вам заглянуть в Pyodbc.

...