Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Alchemy缺少BEGIN似乎会导致会话不同步_Python_Mysql_Apache_Flask_Sqlalchemy - Fatal编程技术网

Python Alchemy缺少BEGIN似乎会导致会话不同步

Python Alchemy缺少BEGIN似乎会导致会话不同步,python,mysql,apache,flask,sqlalchemy,Python,Mysql,Apache,Flask,Sqlalchemy,更新到我的最后一个问题,请阅读背景信息。为了我的努力。我已经做了进一步的调查 TL;DR:对于某些请求,我似乎得到了旧数据。我通过发送一篇文章来更新一个对象,并有几次机会打印该对象的属性来测试这一点。通常情况下,响应是好的,但我经常会得到旧数据。当创建与其他对象有关系的对象时,这是一个大问题,如果出于某种原因外键对象不存在,创建将失败 例如: format@pixel:~$ curl -X POST https://example.com/app/region/rename/5/Old Succ

更新到我的最后一个问题,请阅读背景信息。为了我的努力。我已经做了进一步的调查

TL;DR:对于某些请求,我似乎得到了旧数据。我通过发送一篇文章来更新一个对象,并有几次机会打印该对象的属性来测试这一点。通常情况下,响应是好的,但我经常会得到旧数据。当创建与其他对象有关系的对象时,这是一个大问题,如果出于某种原因外键对象不存在,创建将失败

例如:

format@pixel:~$ curl -X POST https://example.com/app/region/rename/5/Old
Success
format@pixel:~$ curl -X POST https://example.com/app/region/rename/5/New
Success
format@pixel:~$ for i in {1..25}; do  echo ; curl -X GET https://example.com/app/region/name/5/; done
New
New
New
New
New
New
Old
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
New
我在拆卸时打开了SQLALCHEMY\u ECHO和SQLALCHEMY\u COMMIT\u

app.config['SQLALCHEMY_ECHO'] = True
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
并更改代码以打印更多信息

当请求正确时,第一个日志片段是典型的。您可以看到隐式开始和拆卸时提交

[Tue Jul 24 17:49:23.217666 2018] [wsgi:error] [pid 27919:tid 139730801542912] --- Get Start ---
[Tue Jul 24 17:49:23.219964 2018] [wsgi:error] [pid 27919:tid 139730801542912] 2018-07-24 17:49:23,219 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
[Tue Jul 24 17:49:23.220053 2018] [wsgi:error] [pid 27919:tid 139730801542912] INFO:sqlalchemy.engine.base.Engine:BEGIN (implicit)
[Tue Jul 24 17:49:23.221282 2018] [wsgi:error] [pid 27919:tid 139730801542912] 2018-07-24 17:49:23,221 INFO sqlalchemy.engine.base.Engine SELECT region.id AS region_id, region.name AS region_name, region.north AS region_north, region.west AS region_west, region.south AS region_south, region.east AS region_east, region.coords AS region_coords 
[Tue Jul 24 17:49:23.221321 2018] [wsgi:error] [pid 27919:tid 139730801542912] FROM region 
[Tue Jul 24 17:49:23.221336 2018] [wsgi:error] [pid 27919:tid 139730801542912] WHERE region.id = %s
[Tue Jul 24 17:49:23.221356 2018] [wsgi:error] [pid 27919:tid 139730801542912] 
[Tue Jul 24 17:49:23.221414 2018] [wsgi:error] [pid 27919:tid 139730801542912] INFO:sqlalchemy.engine.base.Engine:SELECT region.id AS region_id, region.name AS region_name, region.north AS region_north, region.west AS region_west, region.south AS region_south, region.east AS region_east, region.coords AS region_coords 
[Tue Jul 24 17:49:23.221433 2018] [wsgi:error] [pid 27919:tid 139730801542912] FROM region 
[Tue Jul 24 17:49:23.221447 2018] [wsgi:error] [pid 27919:tid 139730801542912] WHERE region.id = %s
[Tue Jul 24 17:49:23.221465 2018] [wsgi:error] [pid 27919:tid 139730801542912] 
[Tue Jul 24 17:49:23.221683 2018] [wsgi:error] [pid 27919:tid 139730801542912] 2018-07-24 17:49:23,221 INFO sqlalchemy.engine.base.Engine (5,)
[Tue Jul 24 17:49:23.221767 2018] [wsgi:error] [pid 27919:tid 139730801542912] INFO:sqlalchemy.engine.base.Engine:(5,)
[Tue Jul 24 17:49:23.222922 2018] [wsgi:error] [pid 27919:tid 139730801542912] 2018-07-24 17:49:23.222868 New
[Tue Jul 24 17:49:23.222990 2018] [wsgi:error] [pid 27919:tid 139730801542912] --- Get End ---
[Tue Jul 24 17:49:23.224867 2018] [wsgi:error] [pid 27919:tid 139730801542912] 2018-07-24 17:49:23,224 INFO sqlalchemy.engine.base.Engine COMMIT
[Tue Jul 24 17:49:23.224946 2018] [wsgi:error] [pid 27919:tid 139730801542912] INFO:sqlalchemy.engine.base.Engine:COMMIT
下一个代码段是请求不正确时的典型代码段。您可以看到它正在执行与以前相同的选择,但没有开始或提交。不知道这意味着什么,也不知道为什么会发生,但这让我相信问题出在SQLAlchemy或MySQL层

[Tue Jul 24 17:49:23.288116 2018] [wsgi:error] [pid 27919:tid 139730654033664] --- Get Start ---
[Tue Jul 24 17:49:23.290049 2018] [wsgi:error] [pid 27919:tid 139730654033664] 2018-07-24 17:49:23,289 INFO sqlalchemy.engine.base.Engine SELECT region.id AS region_id, region.name AS region_name, region.north AS region_north, region.west AS region_west, region.south AS region_south, region.east AS region_east, region.coords AS region_coords 
[Tue Jul 24 17:49:23.290079 2018] [wsgi:error] [pid 27919:tid 139730654033664] FROM region 
[Tue Jul 24 17:49:23.290092 2018] [wsgi:error] [pid 27919:tid 139730654033664] WHERE region.id = %s
[Tue Jul 24 17:49:23.290109 2018] [wsgi:error] [pid 27919:tid 139730654033664] 
[Tue Jul 24 17:49:23.290168 2018] [wsgi:error] [pid 27919:tid 139730654033664] INFO:sqlalchemy.engine.base.Engine:SELECT region.id AS region_id, region.name AS region_name, region.north AS region_north, region.west AS region_west, region.south AS region_south, region.east AS region_east, region.coords AS region_coords 
[Tue Jul 24 17:49:23.290186 2018] [wsgi:error] [pid 27919:tid 139730654033664] FROM region 
[Tue Jul 24 17:49:23.290197 2018] [wsgi:error] [pid 27919:tid 139730654033664] WHERE region.id = %s
[Tue Jul 24 17:49:23.290214 2018] [wsgi:error] [pid 27919:tid 139730654033664] 
[Tue Jul 24 17:49:23.290422 2018] [wsgi:error] [pid 27919:tid 139730654033664] 2018-07-24 17:49:23,290 INFO sqlalchemy.engine.base.Engine (5,)
[Tue Jul 24 17:49:23.290499 2018] [wsgi:error] [pid 27919:tid 139730654033664] INFO:sqlalchemy.engine.base.Engine:(5,)
[Tue Jul 24 17:49:23.291567 2018] [wsgi:error] [pid 27919:tid 139730654033664] 2018-07-24 17:49:23.291529 @@OLD@@
[Tue Jul 24 17:49:23.291591 2018] [wsgi:error] [pid 27919:tid 139730654033664] --- Get End ---
你可以通过时间戳看到,好的请求和坏的请求都是紧接在一起的,在这个坏的请求之后也有好几个好的请求,似乎没有韵律或理由


我正在使用mysqlclient 1.3.13、SQLAlchemy 1.2.10和Flask SQLAlchemy 2.3.2,并在今天早些时候运行了一个
apt-get-upgrade

如果有人发现此线程存在相同问题,请参考,我修复了我的问题


我的Flask App factory函数有一行
App.App\u context().push()
这是早期基于Flask教程时留下的。在项目重组期间,这条线路被排除在外,问题自行解决。不确定此行为何或如何导致此问题,并且仅针对部分但并非所有请求

这对您帮助不大,但是:MySQL的默认事务隔离级别是可重复读取。因此,如果一个事务在请求之间泄漏,它将像开始时一样提供数据。提交会话自然会结束当前事务,据我所知,Flask中的“拆卸”意味着请求的结束,因此理论上您应该可以。另一方面,缺少的隐式BEGIN和COMMIT看起来好像已经有一个事务在进行中。除了前面的,Flask SQLAlchemy使用一个作用域会话,或者换句话说,一个线程本地会话注册表。因此,如果为请求提供服务的线程未删除或至少未提交/回滚会话,则下次使用该线程时,它可能正在使用现有事务。@IljaEverilä在每个请求开始时是否可以执行检查,以查看会话是否是新的?例如,对于每个连接,从文档
,会话还维护一个事务对象。
因此,如果在执行任何DB交互之前,如果OP首先检查
会话是否存在
事务,并发现存在,这将证明您的理论,对吗?Flask_SQLalchemy包含一个@app.teardown_appcontext,因此我不确定如何或为什么无法提交/回滚上一个会话,但我认为您可能走对了方向。