11

azureml.dataprep我尝试使用Azure Notebook连接到 MS SQL 数据库,如https://docs.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)

我明白了

ExecutionError:登录失败。

我可以在没有 Windows 身份验证的情况下连接到其他数据库。我究竟做错了什么?

4

2 回答 2

4

考虑使用SQL Server 身份验证作为连接到该数据库的解决方法/替代解决方案(相同的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())
于 2019-02-14T14:23:05.700 回答
3

这是关于MSSQLDataSource. 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)
于 2019-02-13T15:18:57.443 回答