>  기사  >  백엔드 개발  >  Entra ID 토큰을 사용하여 SQL Alchemy에서 Azure SQL 데이터베이스에 연결

Entra ID 토큰을 사용하여 SQL Alchemy에서 Azure SQL 데이터베이스에 연결

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-03 18:46:30873검색

Connect to Azure SQL database in SQL Alchemy using Entra ID tokens

요청 기간 동안 Azure SQL 데이터베이스에 연결해야 하는 웹 애플리케이션이 직장에 있습니다. 데이터베이스 쿼리를 더 쉽게 하기 위해 SQL Alchemy와 pyodbc를 사용합니다.

우리는 달성하고 싶은 몇 가지 목표가 있습니다.

  • 모든 요청에는 자체 세션이 있습니다. 요청이 시작되면 새 세션을 열고 완료되면 닫고 싶습니다.
  • 웹 서비스(Azure Function App 또는 Azure Web App)의 관리 ID를 사용하여 데이터베이스에 연결하려고 합니다.
  • 세션 및 연결 처리를 최대한 위임하고 싶습니다.

세션 수명 관리

먼저 모든 요청에 ​​대해 새 세션을 열 수 있도록 새 세션이 생성되고 이후에 삭제되도록 요청 기능을 데코레이터로 래핑할 수 있습니다.

모든 함수 호출에서 세션을 넘겨주지 않고도 애플리케이션 전체에서 세션에 쉽게 액세스할 수 있도록 하기 위해 싱글톤 패턴을 사용합니다. 하지만 동시에 여러 요청을 처리하기 위해 여러 스레드를 실행하므로 세션 개체와 관련된 경쟁 조건이 없는지 확인해야 합니다.

SQL Alchemy에는 이 작업을 더 쉽게 해주는 훌륭한 유틸리티인 범위 지정 세션이 있습니다.

이를 사용하기 위해 연결 팩토리를scoped_session() 호출로 래핑합니다.

from urllib.parse import quote_plus
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session

connection_string = "..."
engine = create_engine("mssql+pyodbc:///?odbc_connect={}".format(quote_plus(connection_string))
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)

이제 세션을 사용하고 싶을 때마다 Session()을 호출하면 SQL Alchemy가 기존 세션 개체를 재사용하는지 확인합니다. 완료되면 Session.remove()를 호출하여 세션을 닫을 수 있습니다. SQL Alchemy에서는 스레드가 완료되었는지 알 수 있는 방법이 없으므로 직접 수행해야 합니다.

관리 ID를 사용하여 Entra ID 토큰을 통해 연결

액세스 토큰을 사용하여 Azure SQL 데이터베이스에 대한 연결을 설정하는 방법을 설명하는 게시물이 있지만 이에 대한 가장 좋은 리소스는 SQL Alchemy 문서 자체입니다.

자세한 내용을 함께 살펴보겠습니다. 먼저 연결 문자열이 필요합니다. 관리 ID(또는 로컬 개발을 위한 Azure CLI)를 사용하기를 원하므로 연결 문자열에 자격 증명을 입력하지 않습니다.

드라이버={SQL Server용 ODBC 드라이버 18};데이터베이스=YOUR_DB;Server=tcp:you.database.windows.net,1433;Encrypt=yes;TrustServerCertificate=no;연결 시간 초과=30

우리의 일반적인 계획은 다음과 같습니다.

  • 데이터베이스에 연결할 때마다 실행되는 이벤트 핸들러를 추가하세요.
  • 데이터베이스에 연결할 때마다 액세스 토큰을 검색합니다.
  • (신선한!) 액세스 토큰을 연결 문자열에 넣을 수 있도록 연결 인수를 조정합니다.

이제 코드를 살펴보겠습니다.

from urllib.parse import quote_plus
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session

connection_string = "..."
engine = create_engine("mssql+pyodbc:///?odbc_connect={}".format(quote_plus(connection_string))
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)

요약

이로써 우리는 목표를 달성했습니다. scoped_session()을 사용하면 요청이 들어올 때마다 새 세션을 열 필요가 없지만(이것은 우리를 위해 처리됩니다) 매달린 세션이 너무 많지 않도록 마지막에 세션을 닫아야 합니다.

또한 자체 ID(로컬 개발용) 또는 웹 서비스의 관리 ID를 사용하여 SQL 데이터베이스에 연결합니다. 새로운 연결이 생성될 때마다 연결 문자열을 수정합니다.

감사의 말

범위 세션의 개념을 이해하는 데 도움을 준 David에게 큰 감사를 드립니다.

위 내용은 Entra ID 토큰을 사용하여 SQL Alchemy에서 Azure SQL 데이터베이스에 연결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.