다음을 통해 공유


Python 또는 R 스크립트에서 SQL Server에 루프백 연결

Applies to: SQL Server 2019(15.x) Azure SQL Managed Instance

Machine Learning Services와 루프백 연결을 사용하여 ODBC를 통해 SQL Server에 다시 연결하여 sp_execute_external_script에서 실행되는 Python 또는 R 스크립트의 데이터를 읽거나 쓰는 방법을 알아봅니다. sp_execute_external_scriptInputDataSetOutputDataSet 인수를 사용할 수 없을 경우 이를 사용할 수 있습니다.

Connection string

루프백 연결을 만들려면 올바른 연결 문자열 사용해야 합니다. 일반적인 필수 인수는 ODBC 드라이버의 이름, 서버 주소 및 데이터베이스의 이름입니다.

Windows에 대한 연결 문자열

Windows의 SQL Server에서 인증하려면 Python 또는 R 스크립트는 Trusted_Connection 연결 문자열 특성을 사용하여 sp_execute_external_script를 실행한 동일한 사용자로 인증할 수 있습니다.

다음은 Windows의 루프백 연결 문자열의 예시입니다.

"Driver=SQL Server;Server=.;Database=nameOfDatabase;Trusted_Connection=Yes;"

Linux의 연결 문자열

Linux의 SQL Server에서 인증하려면 Python 또는 R 스크립트는 ODBC 드라이버의 ClientCertificateClientKey 특성을 사용하여 sp_execute_external_script를 실행한 사용자와 동일한 사용자로 인증해야 합니다. 이를 위해서는 최신 ODBC 드라이버 버전 17.4.1.1을 사용해야 합니다.

다음은 Linux의 루프백 연결 문자열의 예시입니다.

"Driver=ODBC Driver 17 for SQL Server;Server=fe80::8012:3df5:0:5db1%eth0;Database=nameOfDatabase;ClientCertificate=file:/var/opt/mssql-extensibility/data/baeaac72-60b3-4fae-acfd-c50eff5d34a2/sqlsatellitecert.pem;ClientKey=file:/var/opt/mssql-extensibility/data/baeaac72-60b3-4fae-acfd-c50eff5d34a2/sqlsatellitekey.pem;TrustServerCertificate=Yes;Trusted_Connection=no;Encrypt=Yes"

서버 주소, 클라이언트 인증서 파일 위치 및 클라이언트 키 파일 위치는 모든 sp_execute_external_script에 대해 고유하며 API를 사용하여 얻을 수 있습니다(Python의 경우 rx_get_sql_loopback_connection_string(), 또는 R의 경우 rxGetSqlLoopbackConnectionString()).

연결 문자열 특성에 대한 자세한 내용은 Microsoft ODBC Driver for SQL Server에 대한 DSN 및 연결 문자열 키워드 및 특성을 참조하세요.

Azure SQL Managed Instance 연결 문자열.

Azure SQL Managed Instance에 대한 연결 문자열 생성하려면 다음 섹션의 예시를 참조하세요. 루프백 연결의 ODBC 드라이버로 SQL Server용 ODBC 드라이버 11을 사용합니다.

Python용 revoscalepy를 사용하여 연결 문자열 생성

revoscalepy에서 API rx_get_sql_loopback_connection_string()을 사용하여 Python 스크립트에서 루프백 연결에 대한 올바른 연결 문자열을 생성할 수 있습니다.

다음과 같은 인수를 허용합니다.

인수 설명
name_of_database 연결이 이루어질 데이터베이스의 이름
odbc_driver ODBC 드라이버의 이름

예제

Windows 기반 SQL Server의 예:

EXECUTE sp_execute_external_script
@language = N'Python',
@script = N'
from revoscalepy import rx_get_sql_loopback_connection_string, RxSqlServerData, rx_data_step
loopback_connection_string = rx_get_sql_loopback_connection_string(odbc_driver="SQL Server", name_of_database="DBName")
print("Connection String:{0}".format(loopback_connection_string))
data_set = RxSqlServerData(sql_query = "select col1, col2 from tableName",
                           connection_string = loopback_connection_string)
OutputDataSet = rx_data_step(data_set)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

Linux 기반 SQL Server의 예:

EXECUTE sp_execute_external_script
@language = N'Python',
@script = N'
from revoscalepy import rx_get_sql_loopback_connection_string, RxSqlServerData, rx_data_step
loopback_connection_string = rx_get_sql_loopback_connection_string(odbc_driver="ODBC Driver 17 for SQL Server",
                                                                   name_of_database="DBName")
print("Loopback Connection String:{0}".format(loopback_connection_string))
data_set = RxSqlServerData(sql_query = "select col1, col2 from tableName",
                           connection_string = loopback_connection_string)
OutputDataSet = rx_data_step(data_set)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

Azure SQL Managed Instance 예제:

EXECUTE sp_execute_external_script
@language = N'Python',
@script = N'
from revoscalepy import rx_get_sql_loopback_connection_string, RxSqlServerData, rx_data_step
loopback_connection_string = rx_get_sql_loopback_connection_string(odbc_driver="ODBC Driver 11 for SQL Server", name_of_database="DBName")
print("Connection String:{0}".format(loopback_connection_string))
data_set = RxSqlServerData(sql_query = "select col1, col2 from tableName",
                           connection_string = loopback_connection_string)
OutputDataSet = rx_data_step(data_set)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

R용 RevoScaleR을 사용하여 연결 문자열 생성

RevoScaleR에서 API rxGetSqlLoopbackConnectionString()을 사용하여 R 스크립트에서 루프백 연결에 대한 올바른 연결 문자열을 생성할 수 있습니다.

다음과 같은 인수를 허용합니다.

인수 설명
nameOfDatabase 연결이 이루어질 데이터베이스의 이름
ODBCDriver ODBC 드라이버의 이름

예제

Windows 기반 SQL Server의 예:

EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
    loopbackConnectionString <- rxGetSqlLoopbackConnectionString(nameOfDatabase="DBName", odbcDriver ="SQL Server")
    print(paste("Connection String:", loopbackConnectionString))
    dataSet <- RxSqlServerData(sqlQuery = "select col1, col2 from tableName",
                               connectionString = loopbackConnectionString)
    OutputDataSet <- rxDataStep(dataSet)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

Linux 기반 SQL Server의 예:

EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
    loopbackConnectionString <-  rxGetSqlLoopbackConnectionString(nameOfDatabase="DBName", 
                                                                  odbcDriver ="ODBC Driver 17 for SQL Server")
    print(paste("Connection String:", loopbackConnectionString))
    dataSet <- RxSqlServerData(sqlQuery = "select col1, col2 from tableName", 
                               connectionString = loopbackConnectionString)
    OutputDataSet <- rxDataStep(dataSet)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

Azure SQL Managed Instance 예제:

EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
    loopbackConnectionString <- rxGetSqlLoopbackConnectionString(nameOfDatabase="DBName", odbcDriver ="ODBC Driver 11 for SQL Server")
    print(paste("Connection String:", loopbackConnectionString))
    dataSet <- RxSqlServerData(sqlQuery = "select col1, col2 from tableName",
                               connectionString = loopbackConnectionString)
    OutputDataSet <- rxDataStep(dataSet)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

다음 단계