1
5
tl;dr-更新是 实际提交到数据库——它们是正在进行的未提交事务的一部分。 我对您的create_engine()调用做了两个单独的更改。(除了这一行,我使用的是你发布的代码。) 第一个是
之后 第二次调用list_users():
这表明数据不是持久化的,而是保存在session对象中。 我做的第二个更改是将数据库持久化为
但是,如果现在打开我们刚刚创建的数据库并查询其内容,则可以看到添加的用户被持久化到数据库中,但年龄修改不是:
因此,对list_users()的第二个调用是从会话对象(而不是从数据库)获取其值,因为有一个正在进行的事务尚未提交。要证明这一点,请在脚本末尾添加以下行:
|
2
1
由于您声明在系统上实际使用的是MySQL,因此您看到了问题,请检查创建表时使用的引擎类型。默认值是MyISAM,它不支持ACID事务。确保您使用的是InnoDB引擎,它执行ACID事务。 您可以看到一个表使用的是哪种引擎
可以使用alter table更改表的db引擎:
|
3
1
一。例如: 为了确保(或检查)会话不提交更改,只需调用 expunge_all 在会话对象上。这很可能证明这些变化 实际承诺:
2。mysql数据库:
三。会话范围: 寻找问题 unit-of-work . 我发现 contextual sessions 两个世界中最好的一个,在方法调用的层次结构中不需要传递session对象,同时在多线程环境中获得了相当好的安全性。我用的是 地方的 会话,我知道我不想与当前运行的事务(会话)交互。 |
4
0
注意,create_session()的默认值与sessionmaker()相反:autoflush和expire_on_commit为False,autocommit为True。 |
5
0
我的猜测是,因为您已经提交并且正在使用同一个对象,所以每个额外的修改都会自动提交。 |
Arbaaz Ali · 暂停AWS RDS上的复制 1 年前 |
Nero · 我应该如何提取嵌套列表以保存到数据库? 2 年前 |
Danil · 为什么pycharm没有看到sqlalchemy模块? 2 年前 |
user3690132 · Python,SQLalchemy对象长度 6 年前 |