【问题标题】:Can a Python Runbook in Azure Automation run a SQL Query?Azure 自动化中的 Python Runbook 可以运行 SQL 查询吗?
【发布时间】:2021-08-10 19:54:03
【问题描述】:

我在 Microsoft Azure 中有一个 SQL 数据库和一个自动化帐户。每天我都会使用一个抓取机器人来存储两串数据。为此,我使用了一个名为 scraping-bot.io 的网站。获取字符串后,我在 SSMS 中运行 SQL 查询以手动将它们存储在表中。

我的目标是使用带有我的自动化帐户的运行手册来抓取网站,然后运行 ​​SQL 查询以将字符串存储在表中。

我可以在我的自动化帐户中使用 Python Runbook 进行抓取:

import requests
import json

url = 'https://www.scraping-bot.io/rawHtmlPage.html'
username = 'xxxx'
apiKey = 'xxxxxxxxxxxxxxxxxxxx'

apiUrl = "https://www.banpais.hn/barradolar.php"

payload = json.dumps({"url": url})
headers = {'Content-Type': "application/json"}

response = requests.request("POST", apiUrl, data=payload, auth=(username, apiKey), headers=headers)

COMPRA = response.text.partition('var d_compra = ')[2][0:(response.text.partition('var d_compra = ')[2].find(';'))]
VENTA = response.text.partition('var d_venta = ')[2][0:(response.text.partition('var d_compra = ')[2].find(';'))]

COMPRA 和 VENTA 是我正在抓取的字符串。

我对此任务没有任何问题,但是,我无法理解如何运行 SQL 查询以从那里将数据存储在表中。

我试过添加这个:

import pyodbc
server = 'tcp:xxxxxxx.database.windows.net'
database = 'xxxxxxxxxxx'
table = '[dbo].[xxxxxxx]'
username = 'xxxxxxxxxxx'
password = 'xxxxxxxxxxx'

cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server}; SERVER=' + server + '; DATABASE=' + database + '; UID=' + username + '; PWD=' + password)

cursor = cnxn.cursor()
cursor.execute("QUERY HERE")

但是,我收到一个错误:

Traceback (most recent call last):  File "C:\Temp\fdejt30f.zha\eae7fa25-4541-40d1-bc95-83642c705b27", line 5, in <module>    import pyodbcModuleNotFoundError: No module named 'pyodbc'

玩了一会儿后,我能够 pip install pyodbc,但遇到另一个错误,告诉我没有安装“用于 SQL Server 的 ODBC 驱动程序 17”。我被难住了。

有没有办法在 Azure 自动化帐户中使用 python Runbook 运行 SQL 查询?

【问题讨论】:

  • 嗨!谢谢你帮助我。无法尝试,但我相信它会有所帮助。一旦我开始尝试并找到解决方案,我会让任何人都在寻找答案。

标签: python sql-server pyodbc azure-automation azure-runbook


【解决方案1】:

要在 Azure 自动化帐户中使用 python Runbook 运行 SQL 查询,您可以尝试以下 3 种方法:

1. Host the script on Azure HTTP trigger function 由 Jim Xu 回答:

async def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')
    
    server = 'jimtestsql.database.windows.net'
    database = 'test'
    username = 'jim@hanxia.onmicrosoft.com'
    password = 'Wdsr199545#'
    driver= '{ODBC Driver 17 for SQL Server}'
    cnxn = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password+';Authentication=ActiveDirectoryPassword')
    cursor = cnxn.cursor()
    cursor.execute("SELECT Top(1) * FROM [dbo].[StarWars]")
    row = cursor.fetchone()

    return func.HttpResponse(str(row[0]) + " " + str(row[1]))

2。 Use Hybrid Worker Group 作为answered by SwathiDhanwada-MSFT

3. Use Powershell script 由 Jason Ye 回答:

$SqlServer = "jasontest321.database.windows.net"
    $SqlServerPort = "1433"
    $Database = "jasonsqltest"
    $Table = "dbc"
    $SqlCredentialAsset = "sql"
    $SqlCredential = Get-AutomationPSCredential -Name $SqlCredentialAsset 
    if ($SqlCredential -eq $null) 
        { 
            throw "Could not retrieve '$SqlCredentialAsset' credential asset. Check that you created this first in the Automation service." 
        }   
    $SqlUsername = $SqlCredential.UserName 
    $SqlPass = $SqlCredential.GetNetworkCredential().Password 
    $Conn = New-Object System.Data.SqlClient.SqlConnection("Server=tcp:$SqlServer,$SqlServerPort;Database=$Database;User ID=$SqlUsername;Password=$SqlPass;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;")

    $Conn.Open() 
    $Cmd=new-object system.Data.SqlClient.SqlCommand("insert into dbc(name,age)values('jason2','ba')", $Conn) 
    $Cmd.CommandTimeout=120 
    $Ds=New-Object system.Data.DataSet 
    $Da=New-Object system.Data.SqlClient.SqlDataAdapter($Cmd)
    [void]$Da.fill($Ds)
    $Ds.Tables.Column1
    $Conn.Close()

您可以参考Unable to connect to Azure SQL Database via Python ODBC Driver Issue feedback并反馈到Install "ODBC Driver 17 for SQL Server" on the Python Runbook Virtual Machines

【讨论】:

  • 我无法执行答案中的任何一个选项。无论哪种方式,都接受它为其他用户看到它。
猜你喜欢
  • 2020-07-24
  • 1970-01-01
  • 2017-02-15
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2018-08-30
相关资源
最近更新 更多