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

적용 대상: 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 인수 사용이 불가능할 때 사용할 수 있습니다.

연결 문자열

루프백 연결을 위해서는 올바른 연결 문자열을 사용해야 합니다. 일반적인 필수 인수는 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에 대해 고유하며, Python의 경우 API rx_get_sql_loopback_connection_string(), R의 경우에는 rxGetSqlLoopbackConnectionString()을 사용하여 얻을 수 있습니다.

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

Azure SQL Managed Instance의 연결 문자열

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

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

다음 단계