Heim  >  Artikel  >  Backend-Entwicklung  >  Stellen Sie mithilfe von Entra-ID-Tokens eine Verbindung zur Azure SQL-Datenbank in SQL Alchemy her

Stellen Sie mithilfe von Entra-ID-Tokens eine Verbindung zur Azure SQL-Datenbank in SQL Alchemy her

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-03 18:46:30866Durchsuche

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

Wir haben eine Webanwendung im Einsatz, die für die Dauer der Anfrage eine Verbindung zu unserer Azure SQL-Datenbank herstellen muss. Um die Abfrage der Datenbank zu vereinfachen, verwenden wir SQL Alchemy und pyodbc.

Wir haben ein paar Ziele, die wir erreichen wollen:

  • Jede Anfrage erhält eine eigene Sitzung. Wir möchten eine neue Sitzung eröffnen, wenn die Anfrage beginnt, und sie schließen, sobald sie abgeschlossen ist.
  • Wir möchten über die verwaltete Identität des Webdiensts (Azure Function App oder Azure Web App) eine Verbindung zur Datenbank herstellen.
  • Wir möchten die Abwicklung der Sitzung und Verbindung so weit wie möglich delegieren.

Verwaltung der Sitzungslebensdauer

Um sicherzustellen, dass wir für jede Anfrage eine neue Sitzung öffnen, können wir zunächst die Anfragefunktionen in Dekoratoren einbinden, die dafür sorgen, dass eine neue Sitzung erstellt und anschließend zerstört wird.

Um sicherzustellen, dass unsere Sitzung von überall in der Anwendung leicht zugänglich ist, ohne dass wir sie bei jedem Funktionsaufruf übergeben müssen, verwenden wir ein Singleton-Muster. Da wir jedoch mehrere Threads ausführen, um mehrere Anfragen gleichzeitig zu bearbeiten, müssen wir sicherstellen, dass es keine Race Conditions in Bezug auf die Sitzungsobjekte gibt.

SQL Alchemy verfügt über ein großartiges Dienstprogramm, das dies einfacher macht: die bereichsbezogene Sitzung.

Um dies zu nutzen, packen wir unsere Verbindungsfabrik in einen Scoped_session()-Aufruf ein:

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)

Wenn wir nun die Sitzung verwenden möchten, rufen wir einfach Session() auf und SQL Alchemy stellt sicher, dass wir das vorhandene Sitzungsobjekt wiederverwenden. Wenn wir fertig sind, können wir Session.remove() aufrufen, um die Sitzung zu schließen. SQL Alchemy kann nicht feststellen, ob der Thread fertig ist, daher müssen wir dies selbst tun.

Verbinden Sie sich über Entra-ID-Tokens mit verwalteter Identität

Es gibt einige Beiträge, die beschreiben, wie man die Verbindung zu Azure SQL-Datenbanken mithilfe von Zugriffstokens einrichtet, aber die beste Ressource hierfür sind die SQL Alchemy-Dokumente selbst.

Lassen Sie uns gemeinsam die Details besprechen. Zuerst benötigen wir eine Verbindungszeichenfolge. Da wir uns auf eine verwaltete Identität (oder die Azure CLI für die lokale Entwicklung) verlassen möchten, fügen wir keine Anmeldeinformationen in die Verbindungszeichenfolge ein:

Driver={ODBC Driver 18 for SQL Server};Database=YOUR_DB;Server=tcp:you.database.windows.net,1433;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30

Unser allgemeiner Plan ist:

  • Fügen Sie einen Ereignishandler hinzu, der immer dann ausgelöst wird, wenn wir eine Verbindung zur Datenbank herstellen.
  • Rufen Sie ein Zugriffstoken ab, wann immer wir eine Verbindung zur Datenbank herstellen.
  • Passen Sie die Verbindungsargumente so an, dass wir das (frische!) Zugriffstoken in die Verbindungszeichenfolge einfügen.

Werfen wir nun einen Blick auf den Code:

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)

Zusammenfassung

Damit haben wir unsere Ziele erreicht. Mit „scoped_session()“ müssen wir nicht jedes Mal eine neue Sitzung eröffnen, wenn eine Anfrage eingeht (dies wird für uns erledigt), aber wir sollten die Sitzung am Ende schließen, damit wir nicht zu viele baumelnde Sitzungen haben.

Wir stellen auch eine Verbindung zur SQL-Datenbank her, indem wir unsere eigene Identität (für lokale Entwickler) oder die verwaltete Identität des Webdienstes verwenden. Wir ändern die Verbindungszeichenfolge jedes Mal, wenn eine neue Verbindung erstellt wird.

Danksagungen

Ein großes Dankeschön an David, der mir dabei geholfen hat, das Konzept der bereichsbezogenen Sitzungen zu verstehen.

Das obige ist der detaillierte Inhalt vonStellen Sie mithilfe von Entra-ID-Tokens eine Verbindung zur Azure SQL-Datenbank in SQL Alchemy her. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn