Sqlalchemy远程数据库会话刷新/刷新问题

时间:2012-03-28 12:44:36

标签: python mysql database sqlalchemy

我正在使用python-pyside桌面应用程序,它使用远程数据库,应用程序安装在多台机器上,应用程序使用sql炼金术。

问题是: 应用程序有一个表打印机,它由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()

会话仅在应用程序的main / start文件中初始化一次。

请帮帮我。

我试过db_session.flush()也autoflush = True,但是没有用。

2 个答案:

答案 0 :(得分:2)

在获取数据之前使用session.commit代替session.flush

答案 1 :(得分:1)

谢谢Lafada,

在获取(选择/过滤)查询之前,

session.commit解决了我的问题。

#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()