在SQL Server 2017中使用python调用API并存储数据

时间:2018-12-21 22:19:09

标签: python sql json sql-server sql-server-2017

我一直在研究Python中的技能集,以调用RestAPI,返回/解析json并存储结果。最终,我的最终目标是构建程序,以将我们的数据引入我们的数据仓库。

我已经能够调用API并将数据存储到CSV中,并且可以打开数据库连接并运行SQL语句并打印结果,但这是我的止步。

现在,SQL Server 2017能够在SSMS中运行python脚本并创建存储过程,我希望可以弥合SQL的空白,并使用Python调用API,返回数据,然后使用SQL进行验证和附加数据到正确的表。

我在SQL Server中看到的关于Python的唯一脚本示例用于分析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)

当我将for循环取出并将一个位置硬编码到脚本中时,python部分在SQL Server中工作,但不确定如何获取位置变量,该位置变量引用来自select语句的数据列表以在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 :(得分:0)

我认为在已经存在于您的SQL Server实例本身中的Python脚本中执行SQL语句确实没有任何意义。据我了解,能够从SQL Server调用Python的好处是能够访问某些分析功能/转换,这在T-SQL中是不可行的。逻辑应如下:

  1. 从T-SQL脚本调用Python过程。如果需要,它可以将变量用作输入/自变量,并且这些变量可以来自直接在T-SQL环境中执行的先前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 Server之外,并可能使用Docker构建一个合适的Python环境。如果您的脚本位于SQL Server外部,则可以使用不同的方法来连接和查询数据库。我建议您研究一下Pyodbc。