{"id":81803,"date":"2024-10-29T02:06:51","date_gmt":"2024-10-28T22:36:51","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/connect-to-azure-sql-database-in-sql-alchemy-using-entra-id-tokens-4bjl\/"},"modified":"2024-10-29T02:06:51","modified_gmt":"2024-10-28T22:36:51","slug":"connect-to-azure-sql-database-in-sql-alchemy-using-entra-id-tokens-4bjl","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/connect-to-azure-sql-database-in-sql-alchemy-using-entra-id-tokens-4bjl\/","title":{"rendered":"\u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062a\u0648\u06a9\u0646 \u0647\u0627\u06cc Entra ID \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Azure SQL \u062f\u0631 SQL Alchemy \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u062f"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n            \u0645\u0627 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u062f\u0631 \u062d\u0627\u0644 \u06a9\u0627\u0631 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u0645\u062f\u062a \u0632\u0645\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Azure SQL \u0645\u0627 \u0645\u062a\u0635\u0644 \u0634\u0648\u062f. \u0628\u0631\u0627\u06cc \u0633\u0647\u0648\u0644\u062a \u067e\u0631\u0633 \u0648 \u062c\u0648 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u060c \u0627\u0632 SQL Alchemy \u0648 pyodbc.<\/p>\n<p>\u0645\u0627 \u0686\u0646\u062f \u0647\u062f\u0641 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0647 \u0622\u0646\u0647\u0627 \u0628\u0631\u0633\u06cc\u0645:<\/p>\n<p>\u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062c\u0644\u0633\u0647 \u0645\u062e\u0635\u0648\u0635 \u0628\u0647 \u062e\u0648\u062f \u0631\u0627 \u062f\u0627\u0631\u062f. \u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0627 \u0634\u0631\u0648\u0639 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u060c \u06cc\u06a9 \u062c\u0644\u0633\u0647 \u062c\u062f\u06cc\u062f \u0628\u0627\u0632 \u06a9\u0646\u06cc\u0645 \u0648 \u067e\u0633 \u0627\u0632 \u0627\u0646\u062c\u0627\u0645 \u0622\u0646\u060c \u0622\u0646 \u0631\u0627 \u0628\u0628\u0646\u062f\u06cc\u0645.<br \/>\n\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0648\u0628 \u0633\u0631\u0648\u06cc\u0633 (Azure Function App \u06cc\u0627 Azure Web App) \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u0645.<br \/>\n\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u062a\u0627 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062c\u0644\u0633\u0647 \u0648 \u0627\u062a\u0635\u0627\u0644 \u0631\u0627 \u0645\u062d\u0648\u0644 \u06a9\u0646\u06cc\u0645.<\/p>\n<p>  \u0645\u062f\u06cc\u0631\u06cc\u062a \u0637\u0648\u0644 \u0639\u0645\u0631 \u062c\u0644\u0633\u0647<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627\u060c \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u062c\u0644\u0633\u0647 \u062c\u062f\u06cc\u062f \u0628\u0631\u0627\u06cc \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u062a\u0648\u0627\u0628\u0639 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u062f\u0631 \u062f\u06a9\u0648\u0631\u0627\u062a\u0648\u0631\u0647\u0627 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u0645 \u062a\u0627 \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u0646\u062f \u06a9\u0647 \u06cc\u06a9 \u062c\u0644\u0633\u0647 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0648 \u0645\u062a\u0639\u0627\u0642\u0628\u0627\u064b \u0627\u0632 \u0628\u06cc\u0646 \u0645\u06cc\u200c\u0631\u0648\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u062c\u0644\u0633\u0647 \u0645\u0627 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0627\u0632 \u0633\u0631\u0627\u0633\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u062f\u0648\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u062a\u062d\u0648\u06cc\u0644 \u062f\u0627\u062f\u0646 \u0622\u0646 \u062f\u0631 \u0647\u0631 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a\u060c \u0627\u0632 \u06cc\u06a9 \u0627\u0644\u06af\u0648\u06cc singleton \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0627 \u0686\u0646\u062f\u06cc\u0646 \u0631\u0634\u062a\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u0686\u0646\u062f\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0647 \u0637\u0648\u0631 \u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0628\u0627\u06cc\u062f \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u0645 \u06a9\u0647 \u0647\u06cc\u0686 \u0634\u0631\u0627\u06cc\u0637 \u0645\u0633\u0627\u0628\u0642\u0647 \u0627\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u0634\u06cc\u0627\u0621 \u062c\u0644\u0633\u0647 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f.<\/p>\n<p>SQL Alchemy \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0639\u0627\u0644\u06cc \u0628\u0631\u0627\u06cc \u0622\u0633\u0627\u0646 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u062f\u0627\u0631\u062f: \u062c\u0644\u0633\u0647 scoped.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646\u060c \u0645\u0627 \u06a9\u0627\u0631\u062e\u0627\u0646\u0647 \u0627\u062a\u0635\u0627\u0644 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645 scoped_session() \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u062f:<\/p>\n<p>from urllib.parse import quote_plus<br \/>\nfrom sqlalchemy import create_engine<br \/>\nfrom sqlalchemy.orm import sessionmaker, scoped_session<\/p>\n<p>connection_string = &#8220;&#8230;&#8221;<br \/>\nengine = create_engine(&#8220;mssql+pyodbc:\/\/\/?odbc_connect={}&#8221;.format(quote_plus(connection_string))<br \/>\nsession_factory = sessionmaker(bind=engine)<br \/>\nSession = scoped_session(session_factory)<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062d\u0627\u0644\u0627 \u0647\u0631 \u0648\u0642\u062a \u0628\u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u0632 \u062c\u0644\u0633\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645 \u0641\u0642\u0637 \u062a\u0645\u0627\u0633 \u0645\u06cc \u06af\u06cc\u0631\u06cc\u0645 Session() \u0648 SQL Alchemy \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0645\u0627 \u0627\u0632 \u0634\u06cc \u062c\u0644\u0633\u0647 \u0645\u0648\u062c\u0648\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0627\u06af\u0631 \u06a9\u0627\u0631\u0645\u0627\u0646 \u062a\u0645\u0627\u0645 \u0634\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u0645 Session.remove() \u0628\u0631\u0627\u06cc \u0628\u0633\u062a\u0646 \u062c\u0644\u0633\u0647 \u0647\u06cc\u0686 \u0631\u0627\u0647\u06cc \u0628\u0631\u0627\u06cc SQL Alchemy \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f \u06a9\u0647 \u0628\u06af\u0648\u06cc\u062f \u0622\u06cc\u0627 \u0645\u0648\u0636\u0648\u0639 \u0627\u0646\u062c\u0627\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0627 \u0628\u0627\u06cc\u062f \u062e\u0648\u062f\u0645\u0627\u0646 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645.<\/p>\n<p>  \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0646\u0634\u0627\u0646\u0647 \u0647\u0627\u06cc Entra ID \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0686\u0646\u062f \u067e\u0633\u062a \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0646\u062d\u0648\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u0647\u0627\u06cc \u062f\u0627\u062f\u0647 Azure SQL \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0646\u0634\u0627\u0646\u0647 \u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0631\u0627 \u062a\u0648\u0636\u06cc\u062d \u0645\u06cc \u062f\u0647\u062f\u060c \u0627\u0645\u0627 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0645\u0646\u0628\u0639 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u062e\u0648\u062f \u0627\u0633\u0646\u0627\u062f SQL Alchemy \u0627\u0633\u062a.<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0647\u0645 \u0628\u0647 \u062c\u0632\u0626\u06cc\u0627\u062a \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645. \u0627\u0628\u062a\u062f\u0627 \u0628\u0647 \u06cc\u06a9 \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645. \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0647 \u0647\u0648\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 (\u06cc\u0627 Azure CLI \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u0645\u062d\u0644\u06cc) \u062a\u06a9\u06cc\u0647 \u06a9\u0646\u06cc\u0645\u060c \u0647\u06cc\u0686 \u0627\u0639\u062a\u0628\u0627\u0631\u06cc \u0631\u0627 \u062f\u0631 \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 \u0642\u0631\u0627\u0631 \u0646\u0645\u06cc \u062f\u0647\u06cc\u0645:<\/p>\n<p>Driver={ODBC Driver 18 for SQL Server};Database=YOUR_DB;Server=tcp:you.database.windows.net,1433;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30<\/p>\n<p>\u0637\u0631\u062d \u06a9\u0644\u06cc \u0645\u0627 \u0627\u06cc\u0646 \u0627\u0633\u062a:<\/p>\n<p>\u06cc\u06a9 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062a\u0635\u0644 \u0645\u06cc \u0634\u0648\u06cc\u0645 \u0641\u0639\u0627\u0644 \u0634\u0648\u062f.<br \/>\n\u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062a\u0635\u0644 \u0645\u06cc \u0634\u0648\u06cc\u0645\u060c \u06cc\u06a9 \u0646\u0634\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u062f.<br \/>\n\u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u0647\u0627\u06cc \u0627\u062a\u0635\u0627\u0644 \u0631\u0627 \u0637\u0648\u0631\u06cc \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0646\u0634\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc (\u062a\u0627\u0632\u0647!) \u0631\u0627 \u062f\u0631 \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u0645.<\/p>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0646\u06af\u0627\u0647\u06cc \u0628\u0647 \u06a9\u062f \u0628\u06cc\u0646\u062f\u0627\u0632\u06cc\u0645:<\/p>\n<p>import struct<br \/>\nfrom urllib.parse import quote_plus<\/p>\n<p>from azure.core.exceptions import ClientAuthenticationError<br \/>\nfrom azure.identity import DefaultAzureCredential<br \/>\nfrom sqlalchemy import event<\/p>\n<p>@event.listens_for(engine, &#8220;do_connect&#8221;)<br \/>\ndef provide_token(dialect, conn_rec, cargs, cparams):<br \/>\n    # Uid may not be provided for the token authentication to work<br \/>\n    if &#8220;Uid=&#8221; in cargs[0]:<br \/>\n        return<\/p>\n<p>    # Connection option for access tokens as defined in msodbcsql.h<br \/>\n    SQL_COPT_SS_ACCESS_TOKEN = 1256<\/p>\n<p>    # remove the &#8220;Trusted_Connection&#8221; parameter that SQLAlchemy adds<br \/>\n    cargs[0] = cargs[0].replace(&#8220;;Trusted_Connection=Yes&#8221;, &#8220;&#8221;)<br \/>\n    cargs[0] = cargs[0].replace(&#8220;;Authentication=TokenIdentifiedPrincipal&#8221;, &#8220;&#8221;)<\/p>\n<p>    # create token credential =&gt; try two ways to make local dev work<br \/>\n    scope = &#8220;https:\/\/database.windows.net\/.default&#8221;<br \/>\n    try:<br \/>\n        cred = DefaultAzureCredential(exclude_managed_identity_credential=True).get_token(scope)<br \/>\n    except ClientAuthenticationError:<br \/>\n        cred = DefaultAzureCredential(<br \/>\n            exclude_managed_identity_credential=True,<br \/>\n            exclude_shared_token_cache_credential=True,<br \/>\n        ).get_token(scope)<\/p>\n<p>    raw_token = cred.token.encode(&#8220;utf-16-le&#8221;)<br \/>\n    token_struct = struct.pack(f&#8221;{len(raw_token)}s&#8221;, len(raw_token), raw_token)<br \/>\n    cparams[&#8220;attrs_before&#8221;] = {SQL_COPT_SS_ACCESS_TOKEN: token_struct}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u062e\u0644\u0627\u0635\u0647<\/p>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0647 \u0627\u0647\u062f\u0627\u0641\u0645\u0627\u0646 \u0631\u0633\u06cc\u062f\u06cc\u0645. \u0628\u0627 scoped_session() \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u0645\u06cc \u0622\u06cc\u062f \u06cc\u06a9 \u062c\u0644\u0633\u0647 \u062c\u062f\u06cc\u062f \u0628\u0627\u0632 \u06a9\u0646\u06cc\u0645 (\u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0645\u0627 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0645\u06cc \u0634\u0648\u062f) \u0627\u0645\u0627 \u0628\u0627\u06cc\u062f \u062c\u0644\u0633\u0647 \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u0628\u0628\u0646\u062f\u06cc\u0645 \u062a\u0627 \u062c\u0644\u0633\u0627\u062a \u0628\u06cc\u0634 \u0627\u0632 \u062d\u062f \u0622\u0648\u06cc\u0632\u0627\u0646 \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645.<\/p>\n<p>\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0648\u06cc\u062a \u062e\u0648\u062f (\u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0645\u062d\u0644\u06cc) \u06cc\u0627 \u0647\u0648\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0633\u0631\u0648\u06cc\u0633 \u0648\u0628 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 SQL \u0645\u062a\u0635\u0644 \u0645\u06cc \u0634\u0648\u06cc\u0645. \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u0634\u0648\u062f\u060c \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc \u062f\u0647\u06cc\u0645.<\/p>\n<p>  \u0642\u062f\u0631\u062f\u0627\u0646\u06cc \u0647\u0627<\/p>\n<p>\u06cc\u06a9 \u062a\u0634\u06a9\u0631 \u0628\u0632\u0631\u06af \u0627\u0632 \u062f\u06cc\u0648\u06cc\u062f \u06a9\u0647 \u0628\u0647 \u0645\u0646 \u06a9\u0645\u06a9 \u06a9\u0631\u062f \u062a\u0627 \u0645\u0641\u0647\u0648\u0645 \u062c\u0644\u0633\u0627\u062a scoped \u0631\u0627 \u0628\u0641\u0647\u0645\u0645.<\/p>\n<div data-article-id=\"2063373\" id=\"article-body\">\n<p>\u0645\u0627 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u062f\u0631 \u062d\u0627\u0644 \u06a9\u0627\u0631 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u0645\u062f\u062a \u0632\u0645\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Azure SQL \u0645\u0627 \u0645\u062a\u0635\u0644 \u0634\u0648\u062f. \u0628\u0631\u0627\u06cc \u0633\u0647\u0648\u0644\u062a \u067e\u0631\u0633 \u0648 \u062c\u0648 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u060c \u0627\u0632 SQL Alchemy \u0648 <code>pyodbc<\/code>.<\/p>\n<p>\u0645\u0627 \u0686\u0646\u062f \u0647\u062f\u0641 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0647 \u0622\u0646\u0647\u0627 \u0628\u0631\u0633\u06cc\u0645:<\/p>\n<ul>\n<li>\u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062c\u0644\u0633\u0647 \u0645\u062e\u0635\u0648\u0635 \u0628\u0647 \u062e\u0648\u062f \u0631\u0627 \u062f\u0627\u0631\u062f. \u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0627 \u0634\u0631\u0648\u0639 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u060c \u06cc\u06a9 \u062c\u0644\u0633\u0647 \u062c\u062f\u06cc\u062f \u0628\u0627\u0632 \u06a9\u0646\u06cc\u0645 \u0648 \u067e\u0633 \u0627\u0632 \u0627\u0646\u062c\u0627\u0645 \u0622\u0646\u060c \u0622\u0646 \u0631\u0627 \u0628\u0628\u0646\u062f\u06cc\u0645.<\/li>\n<li>\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0648\u0628 \u0633\u0631\u0648\u06cc\u0633 (Azure Function App \u06cc\u0627 Azure Web App) \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u0645.<\/li>\n<li>\u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u062a\u0627 \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062c\u0644\u0633\u0647 \u0648 \u0627\u062a\u0635\u0627\u0644 \u0631\u0627 \u0645\u062d\u0648\u0644 \u06a9\u0646\u06cc\u0645.<\/li>\n<\/ul>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/connect-to-azure-sql-database-in-sql-alchemy-using-entra-id-tokens-4bjl\/#%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA_%D8%B7%D9%88%D9%84_%D8%B9%D9%85%D8%B1_%D8%AC%D9%84%D8%B3%D9%87\" >\u0645\u062f\u06cc\u0631\u06cc\u062a \u0637\u0648\u0644 \u0639\u0645\u0631 \u062c\u0644\u0633\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/connect-to-azure-sql-database-in-sql-alchemy-using-entra-id-tokens-4bjl\/#%D8%A7%D8%B2_%D8%B7%D8%B1%DB%8C%D9%82_%D9%86%D8%B4%D8%A7%D9%86%D9%87_%D9%87%D8%A7%DB%8C_Entra_ID_%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA_%D8%B4%D8%AF%D9%87_%D9%85%D8%AA%D8%B5%D9%84_%D8%B4%D9%88%DB%8C%D8%AF\" >\u0627\u0632 \u0637\u0631\u06cc\u0642 \u0646\u0634\u0627\u0646\u0647 \u0647\u0627\u06cc Entra ID \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/connect-to-azure-sql-database-in-sql-alchemy-using-entra-id-tokens-4bjl\/#%D8%AE%D9%84%D8%A7%D8%B5%D9%87\" >\u062e\u0644\u0627\u0635\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/connect-to-azure-sql-database-in-sql-alchemy-using-entra-id-tokens-4bjl\/#%D9%82%D8%AF%D8%B1%D8%AF%D8%A7%D9%86%DB%8C_%D9%87%D8%A7\" >\u0642\u062f\u0631\u062f\u0627\u0646\u06cc \u0647\u0627<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA_%D8%B7%D9%88%D9%84_%D8%B9%D9%85%D8%B1_%D8%AC%D9%84%D8%B3%D9%87\"><\/span>\n<p>  \u0645\u062f\u06cc\u0631\u06cc\u062a \u0637\u0648\u0644 \u0639\u0645\u0631 \u062c\u0644\u0633\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0628\u062a\u062f\u0627\u060c \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0628\u0627\u0632 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u062c\u0644\u0633\u0647 \u062c\u062f\u06cc\u062f \u0628\u0631\u0627\u06cc \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u062a\u0648\u0627\u0628\u0639 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u062f\u0631 \u062f\u06a9\u0648\u0631\u0627\u062a\u0648\u0631\u0647\u0627 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u0645 \u062a\u0627 \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u0646\u062f \u06a9\u0647 \u06cc\u06a9 \u062c\u0644\u0633\u0647 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0648 \u0645\u062a\u0639\u0627\u0642\u0628\u0627\u064b \u0627\u0632 \u0628\u06cc\u0646 \u0645\u06cc\u200c\u0631\u0648\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u062c\u0644\u0633\u0647 \u0645\u0627 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0627\u0632 \u0633\u0631\u0627\u0633\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u062f\u0648\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u062a\u062d\u0648\u06cc\u0644 \u062f\u0627\u062f\u0646 \u0622\u0646 \u062f\u0631 \u0647\u0631 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0633\u062a\u060c \u0627\u0632 \u06cc\u06a9 \u0627\u0644\u06af\u0648\u06cc singleton \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0627 \u0686\u0646\u062f\u06cc\u0646 \u0631\u0634\u062a\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u0686\u0646\u062f\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0647 \u0637\u0648\u0631 \u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0628\u0627\u06cc\u062f \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u0645 \u06a9\u0647 \u0647\u06cc\u0686 \u0634\u0631\u0627\u06cc\u0637 \u0645\u0633\u0627\u0628\u0642\u0647 \u0627\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u0634\u06cc\u0627\u0621 \u062c\u0644\u0633\u0647 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f.<\/p>\n<p>SQL Alchemy \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0639\u0627\u0644\u06cc \u0628\u0631\u0627\u06cc \u0622\u0633\u0627\u0646 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u062f\u0627\u0631\u062f: \u062c\u0644\u0633\u0647 scoped.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646\u060c \u0645\u0627 \u06a9\u0627\u0631\u062e\u0627\u0646\u0647 \u0627\u062a\u0635\u0627\u0644 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>scoped_session()<\/code> \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"kn\">from<\/span> <span class=\"n\">urllib.parse<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">quote_plus<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">sqlalchemy<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">create_engine<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">sqlalchemy.orm<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">sessionmaker<\/span><span class=\"p\">,<\/span> <span class=\"n\">scoped_session<\/span>\n\n<span class=\"n\">connection_string<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">...<\/span><span class=\"sh\">\"<\/span>\n<span class=\"n\">engine<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">create_engine<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">mssql+pyodbc:\/\/\/?odbc_connect={}<\/span><span class=\"sh\">\"<\/span><span class=\"p\">.<\/span><span class=\"nf\">format<\/span><span class=\"p\">(<\/span><span class=\"nf\">quote_plus<\/span><span class=\"p\">(<\/span><span class=\"n\">connection_string<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">session_factory<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">sessionmaker<\/span><span class=\"p\">(<\/span><span class=\"n\">bind<\/span><span class=\"o\">=<\/span><span class=\"n\">engine<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">Session<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">scoped_session<\/span><span class=\"p\">(<\/span><span class=\"n\">session_factory<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062d\u0627\u0644\u0627 \u0647\u0631 \u0648\u0642\u062a \u0628\u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u0632 \u062c\u0644\u0633\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645 \u0641\u0642\u0637 \u062a\u0645\u0627\u0633 \u0645\u06cc \u06af\u06cc\u0631\u06cc\u0645 <code>Session()<\/code> \u0648 SQL Alchemy \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0645\u0627 \u0627\u0632 \u0634\u06cc \u062c\u0644\u0633\u0647 \u0645\u0648\u062c\u0648\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0627\u06af\u0631 \u06a9\u0627\u0631\u0645\u0627\u0646 \u062a\u0645\u0627\u0645 \u0634\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u0645 <code>Session.remove()<\/code> \u0628\u0631\u0627\u06cc \u0628\u0633\u062a\u0646 \u062c\u0644\u0633\u0647 \u0647\u06cc\u0686 \u0631\u0627\u0647\u06cc \u0628\u0631\u0627\u06cc SQL Alchemy \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f \u06a9\u0647 \u0628\u06af\u0648\u06cc\u062f \u0622\u06cc\u0627 \u0645\u0648\u0636\u0648\u0639 \u0627\u0646\u062c\u0627\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u0627 \u0628\u0627\u06cc\u062f \u062e\u0648\u062f\u0645\u0627\u0646 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B2_%D8%B7%D8%B1%DB%8C%D9%82_%D9%86%D8%B4%D8%A7%D9%86%D9%87_%D9%87%D8%A7%DB%8C_Entra_ID_%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_%D9%87%D9%88%DB%8C%D8%AA_%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA_%D8%B4%D8%AF%D9%87_%D9%85%D8%AA%D8%B5%D9%84_%D8%B4%D9%88%DB%8C%D8%AF\"><\/span>\n<p>  \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0646\u0634\u0627\u0646\u0647 \u0647\u0627\u06cc Entra ID \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0648\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0686\u0646\u062f \u067e\u0633\u062a \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0646\u062d\u0648\u0647 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u0647\u0627\u06cc \u062f\u0627\u062f\u0647 Azure SQL \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0646\u0634\u0627\u0646\u0647 \u0647\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0631\u0627 \u062a\u0648\u0636\u06cc\u062d \u0645\u06cc \u062f\u0647\u062f\u060c \u0627\u0645\u0627 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0645\u0646\u0628\u0639 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u062e\u0648\u062f \u0627\u0633\u0646\u0627\u062f SQL Alchemy \u0627\u0633\u062a.<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0647\u0645 \u0628\u0647 \u062c\u0632\u0626\u06cc\u0627\u062a \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645. \u0627\u0628\u062a\u062f\u0627 \u0628\u0647 \u06cc\u06a9 \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645. \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0647 \u0647\u0648\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 (\u06cc\u0627 Azure CLI \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u0645\u062d\u0644\u06cc) \u062a\u06a9\u06cc\u0647 \u06a9\u0646\u06cc\u0645\u060c \u0647\u06cc\u0686 \u0627\u0639\u062a\u0628\u0627\u0631\u06cc \u0631\u0627 \u062f\u0631 \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 \u0642\u0631\u0627\u0631 \u0646\u0645\u06cc \u062f\u0647\u06cc\u0645:<\/p>\n<p><code>Driver={ODBC Driver 18 for SQL Server};Database=YOUR_DB;Server=tcp:you.database.windows.net,1433;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30<\/code><\/p>\n<p>\u0637\u0631\u062d \u06a9\u0644\u06cc \u0645\u0627 \u0627\u06cc\u0646 \u0627\u0633\u062a:<\/p>\n<ul>\n<li>\u06cc\u06a9 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062a\u0635\u0644 \u0645\u06cc \u0634\u0648\u06cc\u0645 \u0641\u0639\u0627\u0644 \u0634\u0648\u062f.<\/li>\n<li>\u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062a\u0635\u0644 \u0645\u06cc \u0634\u0648\u06cc\u0645\u060c \u06cc\u06a9 \u0646\u0634\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u0631\u0627 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u0647\u0627\u06cc \u0627\u062a\u0635\u0627\u0644 \u0631\u0627 \u0637\u0648\u0631\u06cc \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0646\u0634\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc (\u062a\u0627\u0632\u0647!) \u0631\u0627 \u062f\u0631 \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u0645.<\/li>\n<\/ul>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0646\u06af\u0627\u0647\u06cc \u0628\u0647 \u06a9\u062f \u0628\u06cc\u0646\u062f\u0627\u0632\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"kn\">import<\/span> <span class=\"n\">struct<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">urllib.parse<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">quote_plus<\/span>\n\n<span class=\"kn\">from<\/span> <span class=\"n\">azure.core.exceptions<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">ClientAuthenticationError<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">azure.identity<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">DefaultAzureCredential<\/span>\n<span class=\"kn\">from<\/span> <span class=\"n\">sqlalchemy<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">event<\/span>\n\n\n<span class=\"nd\">@event.listens_for<\/span><span class=\"p\">(<\/span><span class=\"n\">engine<\/span><span class=\"p\">,<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">do_connect<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">provide_token<\/span><span class=\"p\">(<\/span><span class=\"n\">dialect<\/span><span class=\"p\">,<\/span> <span class=\"n\">conn_rec<\/span><span class=\"p\">,<\/span> <span class=\"n\">cargs<\/span><span class=\"p\">,<\/span> <span class=\"n\">cparams<\/span><span class=\"p\">):<\/span>\n    <span class=\"c1\"># Uid may not be provided for the token authentication to work\n<\/span>    <span class=\"k\">if<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">Uid=<\/span><span class=\"sh\">\"<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">cargs<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]:<\/span>\n        <span class=\"k\">return<\/span>\n\n    <span class=\"c1\"># Connection option for access tokens as defined in msodbcsql.h\n<\/span>    <span class=\"n\">SQL_COPT_SS_ACCESS_TOKEN<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1256<\/span>\n\n    <span class=\"c1\"># remove the \"Trusted_Connection\" parameter that SQLAlchemy adds\n<\/span>    <span class=\"n\">cargs<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cargs<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">].<\/span><span class=\"nf\">replace<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">;Trusted_Connection=Yes<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> <span class=\"sh\">\"\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cargs<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cargs<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">].<\/span><span class=\"nf\">replace<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">;Authentication=TokenIdentifiedPrincipal<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> <span class=\"sh\">\"\"<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"c1\"># create token credential =&gt; try two ways to make local dev work\n<\/span>    <span class=\"n\">scope<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">https:\/\/database.windows.net\/.default<\/span><span class=\"sh\">\"<\/span>\n    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">cred<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">DefaultAzureCredential<\/span><span class=\"p\">(<\/span><span class=\"n\">exclude_managed_identity_credential<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">).<\/span><span class=\"nf\">get_token<\/span><span class=\"p\">(<\/span><span class=\"n\">scope<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">except<\/span> <span class=\"n\">ClientAuthenticationError<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">cred<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">DefaultAzureCredential<\/span><span class=\"p\">(<\/span>\n            <span class=\"n\">exclude_managed_identity_credential<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">,<\/span>\n            <span class=\"n\">exclude_shared_token_cache_credential<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">).<\/span><span class=\"nf\">get_token<\/span><span class=\"p\">(<\/span><span class=\"n\">scope<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"n\">raw_token<\/span> <span class=\"o\">=<\/span> <span class=\"n\">cred<\/span><span class=\"p\">.<\/span><span class=\"n\">token<\/span><span class=\"p\">.<\/span><span class=\"nf\">encode<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">utf-16-le<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">token_struct<\/span> <span class=\"o\">=<\/span> <span class=\"n\">struct<\/span><span class=\"p\">.<\/span><span class=\"nf\">pack<\/span><span class=\"p\">(<\/span><span class=\"sa\">f<\/span><span class=\"sh\">\"<\/span><span class=\"s\"><i><span class=\"si\">{<\/span><span class=\"nf\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">raw_token<\/span><span class=\"p\">)<\/span><span class=\"si\">}<\/span><span class=\"s\">s<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nf\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">raw_token<\/span><span class=\"p\">),<\/span> <span class=\"n\">raw_token<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">cparams<\/span><span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">attrs_before<\/span><span class=\"sh\">\"<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"n\">SQL_COPT_SS_ACCESS_TOKEN<\/span><span class=\"p\">:<\/span> <span class=\"n\">token_struct<\/span><span class=\"p\">}<\/span>\n\n<\/i><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AE%D9%84%D8%A7%D8%B5%D9%87\"><\/span>\n<p>  \u062e\u0644\u0627\u0635\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0628\u0647 \u0627\u0647\u062f\u0627\u0641\u0645\u0627\u0646 \u0631\u0633\u06cc\u062f\u06cc\u0645. \u0628\u0627 <code>scoped_session()<\/code> \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc \u0645\u06cc \u0622\u06cc\u062f \u06cc\u06a9 \u062c\u0644\u0633\u0647 \u062c\u062f\u06cc\u062f \u0628\u0627\u0632 \u06a9\u0646\u06cc\u0645 (\u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0645\u0627 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0645\u06cc \u0634\u0648\u062f) \u0627\u0645\u0627 \u0628\u0627\u06cc\u062f \u062c\u0644\u0633\u0647 \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u0628\u0628\u0646\u062f\u06cc\u0645 \u062a\u0627 \u062c\u0644\u0633\u0627\u062a \u0628\u06cc\u0634 \u0627\u0632 \u062d\u062f \u0622\u0648\u06cc\u0632\u0627\u0646 \u0646\u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645.<\/p>\n<p>\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0648\u06cc\u062a \u062e\u0648\u062f (\u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u0647 \u0645\u062d\u0644\u06cc) \u06cc\u0627 \u0647\u0648\u06cc\u062a \u0645\u062f\u06cc\u0631\u06cc\u062a \u0634\u062f\u0647 \u0633\u0631\u0648\u06cc\u0633 \u0648\u0628 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 SQL \u0645\u062a\u0635\u0644 \u0645\u06cc \u0634\u0648\u06cc\u0645. \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u0634\u0648\u062f\u060c \u0631\u0634\u062a\u0647 \u0627\u062a\u0635\u0627\u0644 \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc \u062f\u0647\u06cc\u0645.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%82%D8%AF%D8%B1%D8%AF%D8%A7%D9%86%DB%8C_%D9%87%D8%A7\"><\/span>\n<p>  \u0642\u062f\u0631\u062f\u0627\u0646\u06cc \u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u06cc\u06a9 \u062a\u0634\u06a9\u0631 \u0628\u0632\u0631\u06af \u0627\u0632 \u062f\u06cc\u0648\u06cc\u062f \u06a9\u0647 \u0628\u0647 \u0645\u0646 \u06a9\u0645\u06a9 \u06a9\u0631\u062f \u062a\u0627 \u0645\u0641\u0647\u0648\u0645 \u062c\u0644\u0633\u0627\u062a scoped \u0631\u0627 \u0628\u0641\u0647\u0645\u0645.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0645\u0627 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u062f\u0631 \u062d\u0627\u0644 \u06a9\u0627\u0631 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u0628\u0627\u06cc\u062f \u0628\u0631\u0627\u06cc \u0645\u062f\u062a \u0632\u0645\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Azure SQL \u0645\u0627 \u0645\u062a\u0635\u0644 \u0634\u0648\u062f. \u0628\u0631\u0627\u06cc \u0633\u0647\u0648\u0644\u062a \u067e\u0631\u0633 \u0648 \u062c\u0648 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u060c \u0627\u0632 SQL Alchemy \u0648 pyodbc. \u0645\u0627 \u0686\u0646\u062f \u0647\u062f\u0641 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0628\u0647 \u0622\u0646\u0647\u0627 \u0628\u0631\u0633\u06cc\u0645: \u0647\u0631 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":81804,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-81803","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/81803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=81803"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/81803\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/81804"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=81803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=81803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=81803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}