经过几天的搜索和阅读SQLAlchemy文档并尝试了不同的方法后,我仍然不知道它是如何工作的,所以让我们从项目结构开始:
|───App
│ ├───Config
│ │ └───cfg.py
│ ├───Logic
│ └───Models
│ └───Models.py
├───Routes
├───PrivateAppName
│ └───Logic
│ ├───Admin
│ │ └─── AdminLogic.py
│ ├───Utils
│ │ └─── UtilsLogic.py
│ └───User
│ └─── UserLogic.py
└─── Main.py
在Models.py文件夹中,我将其设置如下:
try:
from BackEnd.App.Config.cfg import DATABASE_CONNECTION
except Exception:
from App.Config.cfg import DATABASE_CONNECTION
db = SQLAlchemy()
app = Flask(__name__, static_url_path='/FrontEnd/Static')
app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_CONNECTION
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
with app.app_context():
db.init_app(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
... class models ...
if __name__ == '__main__':
manager.run()
在我的AdminLogic.py,UserLogic.py和UtilsLogic.py模块中,我这样导入数据库连接:
try:
import BackEnd.App.Models.Models as models
except Exception:
import App.Models.Models as models
我这样使用它,例如:
models.db.session.query(models.User).all()
最后,当我运行服务器并在浏览器中测试我的应用程序并单击将请求发送到后端的一系列不同按钮时,就会出现问题。问题在于请求的处理速度非常慢,有时会发生以下错误:
sqlalchemy.exc.TimeoutError:达到大小5的QueuePool溢出10的限制,连接超时,超时30(此错误的背景位于:http://sqlalche.me/e/3o7r)
当我进入SQL Server Management Studio并从“活动监视器”检查服务器时,在“应用程序”字段中看到很多带有主机名和“ Python”的进程。
所以我的问题是如何避免创建所有这些会话,如何使1个用户只有1个会话并且不再获得TimeoutError?
我试图覆盖以下所有与数据库相关的行:
with current_app.app_context():
models.db.whatever
我也尝试过:
models.db.session.close_all()
# AND
models.db.engine.dispose()
但是以上方法都不能解决我的问题。我将不胜感激有关如何解决此问题的任何建议!