Python 更快地刷新sqlalchemy表模型中的数据

Python 更快地刷新sqlalchemy表模型中的数据,python,sqlalchemy,Python,Sqlalchemy,由于Django和SQLAlchemy处理JSON数据的方式比较复杂,我不得不创建一个系统,该系统既使用它们的模型,也使用标准的SQLAlchemy 我遇到的问题是,当我通过table.update()方法更新表中的信息时,会有相当大的延迟,直到我的SQLAlchemy表模型接收到更改 有没有办法强制更新模型 我的代码大致如下: # Database Connection engine = create_engine('mysql+pymysql://'+dbusername+':'+dbuse

由于Django和SQLAlchemy处理JSON数据的方式比较复杂,我不得不创建一个系统,该系统既使用它们的模型,也使用标准的SQLAlchemy

我遇到的问题是,当我通过
table.update()
方法更新表中的信息时,会有相当大的延迟,直到我的SQLAlchemy表模型接收到更改

有没有办法强制更新模型

我的代码大致如下:

# Database Connection
engine = create_engine('mysql+pymysql://'+dbusername+':'+dbuserpass+dbserver+dbname, 
pool_recycle=3600, echo=False)
con = scoped_session(sessionmaker(autocommit=True,autoflush=False,bind=engine))
Session = sessionmaker(bind=engine)
sess = Session()
meta = MetaData(engine)
insp = inspect(engine)
Base = declarative_base()
con.close()
engine.dispose()

# sqlalchemy table model
class ContactsTable(Base):
    __tablename__ = 'contacts_tbl'
    db_id = Column(Integer, primary_key=True)
    per_contact_id = Column(JSON)
    createdDateTime = Column(JSON)
    lastModifiedDateTime = Column(JSON)
    distlists = Column(JSON)

# Theres a lot of code missing here you can see the basics of what I'm doing, adding data and then reading

def add_to_dist(contact,dist,tbl=contacts_tbl):
    con.execute(tbl.update().values(distributionLists=dists).where(tbl.c.per_contact_id==contact))

def get_dist_members(name):
    data = sess.query(ContactsTable).filter(ContactsTable.distributionLists.contains(name)).all()
一切正常。只是查询数据已经过时,似乎需要10分钟才能刷新。这很烦人,因为它在显示数据的网页上运行。它确实需要立即反映这些变化


如果事实上我做的整件事都不正确,那么请随意教我

通过向引擎添加隔离级别=“读取未提交”来解决此问题:

engine = create_engine('mysql+pymysql://'+dbusername+':'+dbuserpass+dbserver+dbname, pool_recycle=3600, echo=False, isolation_level="READ UNCOMMITTED")

感谢Ilja为我指明了正确的方向。

通过在引擎中添加隔离级别=“READ UNCOMMITTED”解决了这个问题:

engine = create_engine('mysql+pymysql://'+dbusername+':'+dbuserpass+dbserver+dbname, pool_recycle=3600, echo=False, isolation_level="READ UNCOMMITTED")

感谢Ilja为我指明了正确的方向。

听起来好像你正在打开一个事务,然后在大约10分钟后,有什么东西触发了一个新的事务-可能是连接被回收之类的。由于您使用的是MySQL,您可能使用的是其默认事务隔离级别REPEATABLE READ(nomen est omen),因此保持事务打开意味着您正在从相同的已建立快照中读取。此外,SQLAlchemy中的
会话
对使用Core(
execute(tbl.update()…)
)所做的更改不起作用,您必须手动使受影响的对象过期。相关阅读:,这听起来像是你正在打开一个事务,然后在大约10分钟后,有什么东西触发了一个新的事务——可能是连接被回收或诸如此类。由于您使用的是MySQL,您可能使用的是其默认事务隔离级别REPEATABLE READ(nomen est omen),因此保持事务打开意味着您正在从相同的已建立快照中读取。此外,SQLAlchemy中的
会话
对使用Core(
execute(tbl.update()…)
)所做的更改不起作用,您必须手动使受影响的对象过期。相关阅读:,