在Azure中,我使用python web应用程序,并使用系统分配的托管身份访问Azure sql数据库。代码在本地运行良好。
原始代码:
azure_credentials = identity.DefaultAzureCredential()
raw_token = azure_credentials.get_token(TOKEN_URL).token.encode("utf-16-le")
结果2022-10-06T14:13:28.375074194Z[INFO azure.identity_credentials.conchined]DefaultAzureCredential从ManagedIdentity Credential获取了一个令牌2022-10-06T14:13:29.630486437Z[2022-10-06 14:13:29+0000][87][WARNING]pid为91的工人因信号11而终止2022-10-06T14:13:29.658152384Z[2022-10-06 14:13:29+0000][97][INFO]启动带有pid的工作程序:97
为什么get_token会导致线程终止?
pyodbc版本已从pyodbc==4.0.32到pyodbc==4.0.34
以下代码在4.0.34下本地运行,但在部署到azure web应用程序时终止线程而不显示错误消息。
credential = DefaultAzureCredential() # (Doesn't matter which credential)
token = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
token_struct = struct.pack(f'<I{len(token)}s', len(token), token)
SQL_COPT_SS_ACCESS_TOKEN = 1256
connString = f"Driver={{ODBC Driver 17 for SQL Server}};SERVER=myServer;DATABASE=myDatabase"
conn = pyodbc.connect(connString, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
cursor = conn.cursor()
cursor.execute("Select * from users")
目前的解决方案是坚持使用pyodbc 4.0.32。