首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么SQLAlchemy执行更新不起作用

为什么SQLAlchemy执行更新不起作用
EN

Stack Overflow用户
提问于 2014-02-12 07:38:14
回答 1查看 1.3K关注 0票数 1

我有以下几点:

代码语言:javascript
复制
@periodic_task(run_every=crontab(minute="*/1"))
def PeriodicUpdateAgentLastRica():
    query = """update agents
            inner join
               (select sims.consignment_agents_id as agents_id,
                MAX(sims.rica_current_stamp) 
            as last_rica_stamp
            from sims
            where sims.rica_current_stamp > DATE_SUB(now(), INTERVAL 3 MONTH) and sims.consignment_agents_id is not NULL
            group by sims.consignment_agents_id) as dt on dt.agents_id = agents.id
            set agents.last_rica_stamp = dt.last_rica_stamp"""
    res = Session.execute(query)
    print res
    if res.rowcount:
        log.info("Updated %s agents" % res.rowcount)
    #transaction.commit()

当我运行celery worker -B时,返回的内容如下:

代码语言:javascript
复制
[2014-02-12 09:15:00,012: INFO/MainProcess] Received task: prepaid.models.Prepaid.PeriodicUpdateAgentLastRica[9ca091c8-595f-4163-8ddf-2742e573b90c]
[2014-02-12 09:15:01,812: WARNING/Worker-7] <sqlalchemy.engine.result.ResultProxy object at 0x776f310>
[2014-02-12 09:15:01,813: INFO/Worker-7] Updated 2923 agents 
[2014-02-12 09:15:01,816: INFO/MainProcess] Task prepaid.models.Prepaid.PeriodicUpdateAgentLastRica[9ca091c8-595f-4163-8ddf-2742e573b90c] succeeded in 1.798980095s: None

尽管它说它更新了:Updated 2923 agents,但当我检查DB时,没有更改任何记录。

这个查询没有什么问题,就像我在mySQL工作台上运行它一样。

当我试图强迫AutoCommit时,也会发生同样的情况。

代码语言:javascript
复制
res = Session.execute(text(query).execution_options(autocommit=True))

所以它提交了,但是Update仍然没有影响DB。为什么它不影响数据库?为什么不起作用?

更新

我也尝试过这样做:

代码语言:javascript
复制
with transaction.manager:
    #Rest of code

但是它仍然没有改变DB中的任何内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-12 10:25:20

这看起来像是在金字塔中使用zodb事务管理器。

您必须将会话标记为已更改。

http://www.upfrontsystems.co.za/Members/izak/sysadman/how-to-commit-a-transaction-even-when-sqlalchemy-thinks-the-session-is-clean

你应该做这样的事

代码语言:javascript
复制
from zope.sqlalchemy import mark_changed
mark_changed(Session)

如果那不起作用,试一试

代码语言:javascript
复制
from zope.sqlalchemy import ZopeTransactionExtension
Session.configure(extension=ZopeTransactionExtension('changed'))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21721545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档