我尝试使用 Azure 笔记本中的azureml.dataprep
连接到 MS SQL 数据库,如 https://learn.microsoft.com/en-us/azure/machine-learning/service/how-to-load-data#load-sql-data 中所述,使用 MSSqlDataSource,使用以下形式的代码
import azureml.dataprep as dprep
secret = dprep.register_secret(value="[SECRET-PASSWORD]", id="[SECRET-ID]")
ds = dprep.MSSQLDataSource(server_name="[SERVER-NAME]",
database_name="[DATABASE-NAME], [PORT]",
user_name="[DATABASE-USERNAME]",
password=secret)
将[DATABASE-USERNAME]
设置为等于MYWINDOWSDOMAIN\MYWINDOWSUSERNAME
,密码[SECRET-PASSWORD]
与我的 Windows 密码一致(即尝试使用 Windows 身份验证(。
触发查询后
dataflow = dprep.read_sql(ds, "SELECT top 100 * FROM [dbo].[MYTABLE]")
dataflow.head(5)
我得到
执行错误:登录失败。
我可以在没有Windows身份验证的情况下连接到其他数据库。我做错了什么?
考虑使用 SQL 服务器身份验证作为连接到该数据库的解决方法/替代解决方案(相同的语法dataflow
有效(:
import azureml.dataprep as dprep
secret = dprep.register_secret(value="[SECRET-PASSWORD]", id="[SECRET-ID]")
ds = dprep.MSSQLDataSource(server_name="[SERVER-NAME],[PORT]",
database_name="[DATABASE-NAME]",
user_name="[DATABASE-USERNAME]",
password=secret)
请注意,dataprep
的使用已弃用,sqlalchemy
可以用作替代
import pandas as pd
from sqlalchemy import create_engine
def mssql_engine(user = "[DATABASE-USERNAME]",
password = "[SECRET-PASSWORD]",
host = "[SERVER-NAME],[PORT]",
db = "[DATABASE-NAME]"):
engine = create_engine(f'mssql+pyodbc://{user}:{password}@{host}/{db}?driver=SQL+Server')
return engine
query = "SELECT ..."
df = pd.read_sql(query, mssql_engine())
MSSQLDataSource
上的MS Doc。 MSSQLDataSource
实例都有一个属性,credentials_type
默认为 SERVER
。尝试在执行查询之前将其显式设置为 WINDOWS
。此外,端口应与服务器名称一起指定。
import azureml.dataprep as dprep
windows_domain = 'localhost'
windows_user = 'my_user'
windows_password = 'my_password'
secret = dprep.register_secret(value=windows_password, id="password")
ds = dprep.MSSQLDataSource(server_name="localhost",
database_name="myDb",
user_name=f'{windows_domain}{windows_user}',
password=secret)
ds.credentials_type = dprep.DatabaseAuthType.WINDOWS
dataflow = dprep.read_sql(ds, "SELECT top 100 * FROM [dbo].[MYTABLE]")
dataflow.head(5)