从另一个会话

时间:2017-07-18 14:49:38

标签: python mysql sqlite sqlalchemy innodb

我遇到了sqlalchemy的问题,即使在提交和刷新对象后,对一个会话中的记录的更新也不会反映在第二个会话中。

为了演示,请考虑这个(完整)示例:

import logging
from sqlalchemy import create_engine, Column, Boolean, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

logging.basicConfig(level=logging.INFO)
logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO)

# works with this
#engine = create_engine("sqlite://")

# fails with this    
engine = create_engine("mysql+mysqldb://{user}:{pass}@{host}:{port}/{database}?charset=utf8mb4".format(**DB_SETTINGS))

Session = sessionmaker(bind=engine)
Base = declarative_base()

class Foo(Base):
    __tablename__ = "foo"
    id = Column(Integer, primary_key=True, autoincrement=True)
    flag = Column(Boolean)
    def __repr__(self):
        return "Foo(id={0.id}, flag={0.flag})".format(self)

# create the table
Base.metadata.create_all(engine)

# add a row
session = Session()
foo = Foo(id=1, flag=False)
session.add(foo)
session.commit()

# fetch the row in a different session
session2 = Session()
foo2 = session2.query(Foo).filter_by(id=1).one()
logging.info("SESSION2: Got {0}".format(foo2))

# update the row in first session and commit
foo.flag = True
session.commit()

# refresh the row in second session
logging.info("SESSION2: Refreshing...")
session2.refresh(foo2)
logging.info("SESSION2: After refresh: {0}".format(foo2))

# does "flag" come back as True?

当我使用mysql + mysqldb://引擎运行此连接以连接到我的远程MySQL实例时,foo.flag的更改而不是反映在session2中。

但是,如果我使用简单的sqlite://内存数据库取消注释创建引擎的行,则对会话2中的foo.flag 的更改

我的MySQL服务器配置是什么导致一个会话中的UPDATE命令,紧接着另一个会话中的SELECT查询返回不同的数据?

0 个答案:

没有答案