Sqlalchemy удаленный сеанс базы данных обновления / сброса проблемы - PullRequest
2 голосов
/ 28 марта 2012

Я работаю над настольным приложением python-pyside, которое использует удаленную базу данных, и приложение установлено на нескольких компьютерах, приложение использует sql alchemy.

Проблема: Приложение имеет настольный принтер, оно состоит из 8 записей. Предположим, приложение работает на 2 машинах m1 и m2, если пользователь m1 удаляет / обновляет / вставляет запись принтера, и после этого, если m2 получает принтер, то он показывает 8 принтеров (так же, как при запуске) Если m2 выполняет какие-либо операции обновления / вставки / удаления в приложении и пытается получить записи с принтера, то он показывает правильные данные.

Я думаю, что эта проблема / поведение связано с сеансом sql alchemy.

Код:

#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, но это не сработало.

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Используйте session.commit вместо session.flush перед получением данных.

1 голос
/ 30 марта 2012

Спасибо, Лафада,

session.commit до того, как запрос get (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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...