Heim > Artikel > Backend-Entwicklung > Stellen Sie mithilfe von Entra-ID-Tokens eine Verbindung zur Azure SQL-Datenbank in SQL Alchemy her
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:
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.
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:
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)
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.
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!