【问题标题】:using python in SQL Server 2017 to call APIs and store data在 SQL Server 2017 中使用 python 调用 API 和存储数据
【发布时间】:2018-12-21 22:19:08
【问题描述】:

我一直在研究我在 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'}]

【问题讨论】:

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


    【解决方案1】:

    我认为在已经驻留在 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 服务器之外,并为自己构建一个合适的 Python 环境,可能使用 Docker。如果您的脚本位于 SQL Server 之外,则有不同的方法可以连接和查询您的数据库。我建议你看看 Pyodbc。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2019-10-06
      • 2022-01-08
      • 2019-04-23
      相关资源
      最近更新 更多