我正在开发python pyside桌面应用程序,该应用程序使用远程数据库,应用程序安装在多台机器上,应用程序使用sql alchemy。
问题是:应用程序有一台表格打印机,由8条记录组成。假设应用程序正在2台机器m1和m2上运行,如果m1用户删除/更新/插入打印机记录,然后如果m2获得打印机,则显示8台打印机(与启动时相同)如果m2在应用程序中执行任何更新/插入/删除操作,并尝试从打印机获取记录,则它显示正确的数据。
我认为这个问题/行为是由于sql炼金术会话造成的。
代码:
#config file
self.engine = create_engine ('mysql://user:pwd@remotehost/database')
#Database session file
configuration=Config() #config consist db,dbusername,
#host name, pwd and engin
engine =configuration.engine
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
#initialization
import models
Base.metadata.create_all(bind=engine)
#Printer model file
#get query
printers = db_session.query(Printer).filter(Printer.status != 0)
.order_by(asc(Printer.name)).all()
#alternative get query used/it also have same problem
printers = Printer.query.filter(Printer.status != 0)
.order_by(asc(Printer.name)).all()
会话在应用程序的主/启动文件中仅初始化一次。
请帮帮我。
我也尝试过db_session.flush()autoflush=True,但没有成功。
在获取数据之前使用session.commit
而不是session.flush
。
感谢拉法达,
session.commit beforeget(select/filter)查询解决了我的问题。
#Printer model file
db_session.commit()
#get query
printers = db_session.query(Printer).filter(Printer.status != 0)
.order_by(asc(Printer.name)).all()
#alternative get query used/it also have same problem
db_session.commit()
printers = Printer.query.filter(Printer.status != 0)
.order_by(asc(Printer.name)).all()