与 Microsoft Azure sql 数据库的连接在本地环境中有效,但在生产环境中无效

connection to microsoft azure sql database works in local enviornment but not in production

我正在尝试打开一个 Web 服务应用程序,它允许我使用 python 代码连接到 Azure 数据库,我尝试过使用 sqlalchemypyodbc,我是成功连接到我机器上的数据库,在本地主机上,我可以在那里执行我想要的所有必要操作。但我希望能够将此代码设置为能够在 ajax 调用中命中特定路由,该调用可以对我的数据库执行某些操作,例如将用户活动标志翻转为 false。但是问题是,当我将 python 代码上传到 azure 时,使用此处的指南 (https://docs.microsoft.com/en-us/azure/app-service/quickstart-python?tabs=bash&pivots=python-framework-flask) 它只是 return 一个 500 服务器错误,我无法在跟踪中找到任何关于为什么它不起作用,我认为可能只是我的本地计算机在数据库的 IP 地址中被列入白名单,但即使我将该应用程序服务 IP 地址添加到允许的 IP,它仍然 return 是一个服务器错误。这是代码的设置:

from flask import Flask
from sqlalchemy import create_engine
import pyodbc

app = Flask(__name__)

@app.route('/')
def connection():
    Driver = "{ODBC Driver 13 for SQL Server}"
    Server = "server string"
    Port = 1433
    Database = "dbname"
    Uid = "user"
    Pwd = "pass"
    
    try:
        cnxn = pyodbc.connect(f'DRIVER={Driver};SERVER={Server};DATABASE={Database};Uid={Uid};Pwd={Pwd};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;')
        cursor = cnxn.cursor()
        cursor.execute(f"SELECT * FROM (Database Table) where id = 999999999;")

    for row in cursor:
        print('row = %r' % (row,))
    return "Connection to database successful"

我省略了某些细节,但语法应该保持不变,同样,在我的本地机器上,我可以连接到数据库和 return 数据。但是一旦它在 azure 中编译了代码,它就不再有效了。

请原谅try的说法。我试图捕获错误并将其发送给客户端,希望从 500 错误中收集更多信息,但它没有用。

**编辑:值得一提的是,如果我删除实际的连接字符串以及与连接到数据库有关的任何内容,代码将 return "connection to database successful" 这让我相信它根本没有完全连接到数据库。这就是它出错的原因,但问题仍然存在,为什么我可以在我的本地环境中连接,但不能在 azure 中连接?

你听说过 Azure 远程调试吗?这是使用您的 visual studio 代码或 VS 在您的网络或应用程序最初运行良好的情况下跟踪错误的最佳工具。您可以使用多种方法逐行调试或逐簇调试。请在这里查看

https://docs.microsoft.com/en-us/visualstudio/debugger/remote-debugging?view=vs-2019

所以对此的简短回答是应用程序服务缺少驱动程序 {ODBC Driver 13 for SQL Server} 它没有在本地出错,因为我在本地安装了该驱动程序,但该驱动程序在应用程序中不可用。为了让它工作,我必须将应用程序安装到虚拟机才能正确下载驱动程序。

幸运的是,基于 linux 构建的 Azure Web 应用程序已经附带 {ODBC Driver 17 for SQL Server} 因此将驱动程序从 13 翻转到 17 允许应用程序成功连接到我的数据库。