You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure App Service部署后无法自动初始化Azure SQL数据库报错

问题根本原因

数据库初始化逻辑放在if __name__ == "__main__":判断块中,该分支仅在本地直接执行入口Python文件时触发。部署到Azure App Service后,生产环境通过WSGI服务器(如gunicorn)加载应用,不会进入该判断分支,_db.create_all()从未执行,因此不会自动创建表,查询时抛出Invalid object name错误。

修复步骤
  • 将建表逻辑移出__main__判断块,在应用初始化完成、所有数据模型导入完成后,通过Flask应用上下文执行建表操作,保证无论以本地脚本还是生产WSGI方式启动,建表逻辑都会执行。
    调整后的初始化代码参考:
    server = "bookingserver.database.windows.net"
    database = 'bookingdatabase'
    username = 'server'
    password = #pass here#
    driver = '{ODBC Driver 17 for SQL Server}'
    
    odbc_str = 'DRIVER='+driver+';SERVER='+server+';PORT=1433;UID='+username+';DATABASE='+ database + ';PWD='+ password
    connect_str = 'mssql+pyodbc:///?odbc_connect=' + urllib.parse.quote_plus(odbc_str)
    app.config['SQLALCHEMY_DATABASE_URI'] = connect_str
    _db = SQLAlchemy(app)
    
    # 注意:执行这行前要确保所有数据模型都已经被导入,注册到SQLAlchemy元数据中
    with app.app_context():
        _db.create_all()
    
    if __name__ == "__main__": 
        app.run()
    
  • 修正数据模型的缩进问题,你贴出的模型代码中类属性没有缩进在类定义块内,会导致SQLAlchemy无法识别模型字段,正确的模型格式如下:
    class Prenotation(_db.Model):
        id = _db.Column(_db.Integer, primary_key=True)
        hour= _db.Column(_db.String(30))
        username = _db.Column(_db.String(30))
        code = _db.Column(_db.Integer)
    
        def __init__( self, hour, username, code):
           self.hour = hour
           self.username = username
           self.code = code
    
  • 你报错中提到找不到users表,但贴出的模型仅包含Prenotation类,请确认对应users表的模型类在_db.create_all()执行前已经完成导入,否则SQLAlchemy不会为未注册的模型创建数据表。

内容的提问来源于stack exchange,提问作者luiss.black

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:18:56