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
相关产品推荐
相关产品推荐

