Вопрос по mysql, python – Как отключить кеширование SQLAlchemy?

14

У меня проблема с кэшированием при использованииsqlalchemy.

я используюsqlalchemy вставить данные в базу данных MySQL. Затем у меня есть другое приложение, которое обрабатывает эти данные и обновляет их напрямую.

Ноsqlalchemy всегда возвращает старые данные, а не обновленные данные. Я думаюsqlalchemy кэшировал мой запрос ... так ... как мне его отключить?

Связанные с?stackoverflow.com/questions/16586114/… Prof. Falken

Ваш Ответ

6   ответов
3

zzzeek отличный ответ,

У меня была похожая проблема. Я решил проблему с помощью коротких сеансов.

with closing(new_session()) as sess:
    # do your stuff

Я использовал новый сеанс для каждой задачи, группы задач или запроса (в случае веб-приложения). Это решило «кеширование» проблема для меня.

Этот материал былvery полезно для меня:

Когда я создаю сеанс, когда я его фиксирую и когда закрываю

Error: User Rate Limit Exceededdocs.sqlalchemy.org/en/rel_0_8/orm/…
0

Основываясь на вашем методе извлечения данных из БД, вы должны выполнить некоторые тесты после того, как другие обновят базу данных, посмотрите, можете ли вы получить новые данные.

(1) use connection:
connection = engine.connect()
result = connection.execute("select username from users")
for row in result:
    print "username:", row['username']
connection.close()
(2) use Engine ...
(3) use MegaData...

Пожалуйста, следуйте за шагом в:http://docs.sqlalchemy.org/en/latest/core/connections.html

Другая возможная причина - ваша БД MySQL не обновляется постоянно. Перезапустите службу MySQL и проверьте.

Error: User Rate Limit Exceededsession.closeError: User Rate Limit Exceededscoped_session... Zeyi Fan
3

и моим решением было истечение срока действия всех объектов в сеансе после каждого запроса.

from flask.signals import request_finished
def expire_session(sender, response, **extra):
    app.db.session.expire_all()
request_finished.connect(expire_session, flask_app)

Работал как шарм.

13

У меня есть приложение Flask / SQLAlchemy, работающее вместе со старым PHP-сайтом. Сайт PHP будет записывать в базу данных, а SQLAlchemy не будет знать о каких-либо изменениях.

Я попытался установить сессионную настройку autoflush = True безуспешно Я пробовал db_session.flush (), db_session.expire_all () и db_session.commit () перед запросом, и ничего не получалось. По-прежнему показывал устаревшие данные.

Наконец я наткнулся на этот раздел документации по SQLAlchemy:http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#transaction-isolation-level

Установка изоляционного уровня работала отлично. Теперь мое приложение Flask "говорит" в приложение PHP. Вот код:

engine = create_engine(
                "postgresql+pg8000://scott:[email protected]/test",
                isolation_level="READ UNCOMMITTED"
            )

Когда движок SQLAlchemy запускается с помощью «READ UNCOMMITED» уровень изоляции - он будет выполнять «грязные чтения»; Это означает, что он будет читать незафиксированные изменения непосредственно из базы данных.

Надеюсь это поможет

Вот возможное решение любезно предоставлено AaronD в комментариях

from flask.ext.sqlalchemy import SQLAlchemy

class UnlockedAlchemy(SQLAlchemy):
    def apply_driver_hacks(self, app, info, options):
        if "isolation_level" not in options:
            options["isolation_level"] = "READ COMMITTED"
    return super(UnlockedAlchemy, self).apply_driver_hacks(app, info, options)
Error: User Rate Limit Exceededflask.ext.sqlalchemy.SQLAlchemyError: User Rate Limit Exceeded
Error: User Rate Limit Exceededflask.ext.sqlalchemy.SQLAlchemyError: User Rate Limit Exceededapply_driver_hacksError: User Rate Limit ExceededREAD COMMITTEDError: User Rate Limit Exceeded
Error: User Rate Limit Exceededclass UnlockedAlchemy(SQLAlchemy): def apply_driver_hacks(self, app, info, options): if not "isolation_level" in options: options["isolation_level"] = "READ COMMITTED" return super(UnlockedAlchemy, self).apply_driver_hacks(app, info, options)
Error: User Rate Limit Exceededengine_from_configError: User Rate Limit Exceededsqlalchemy.isolation_level = READ UNCOMMITTEDError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
37

по которой люди думают, что это «кэш» кроме обычной карты идентификации SQLAlchemy, которая является локальной для транзакции, они играют роль в том, что они наблюдают эффекты изоляции транзакции. Сессия SQLAlchemy по умолчанию работает в транзакционном режиме, то есть ожидаетsession.commit() вызывается для сохранения данных в базе данных. В течение этого времени другие транзакции, выполняемые в другом месте, не увидят эти данные.

Однако из-за изолированного характера транзакций возникает дополнительный поворот. Эти другие незавершенные транзакции не только не увидят данные вашей транзакции, пока они не будут подтверждены, но и в некоторых случаях не смогут увидеть их доthey are committed or rolled back также (что тот же эффект, что ваш close () имеет здесь). Транзакция со средней степеньюisolation будет удерживать состояние, которое оно загрузило до сих пор, и продолжать предоставлять вам то же самое состояние, локальное для транзакции, даже если реальные данные изменились - это называетсяrepeatable reads на языке изоляции транзакций.

http://en.wikipedia.org/wiki/Isolation_%28database_systems%29

-1

не хранит кэшитак что надо смотреть напротоколирование выход.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsession.closeError: User Rate Limit Exceededscoped_sessionError: User Rate Limit Exceeded Zeyi Fan
Error: User Rate Limit Exceededecho = TrueError: User Rate Limit Exceeded Zeyi Fan
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededMySQLdbError: User Rate Limit Exceeded Zeyi Fan

Похожие вопросы