【问题标题】:Why is SQLAlchemy execute Update not working为什么 SQLAlchemy 执行更新不起作用
【发布时间】:2014-03-10 09:38:07
【问题描述】:

我有以下几点:

@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 时,返回的是:

[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,但当我检查数据库时,没有任何记录发生变化。

查询没有任何问题,因为当我在 mySQL Workbench 中运行它时它可以工作。

当我尝试强制 AutoCommit 时也会发生同样的情况,即

res = Session.execute(text(query).execution_options(autocommit=True))

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

更新

我也试过这样做:

with transaction.manager:
    #Rest of code

但它仍然没有改变数据库中的任何内容

【问题讨论】:

    标签: python mysql transactions sqlalchemy pyramid


    【解决方案1】:

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

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

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

    你应该做类似的事情

    from zope.sqlalchemy import mark_changed
    mark_changed(Session)
    

    如果这不起作用,请尝试

    from zope.sqlalchemy import ZopeTransactionExtension
    Session.configure(extension=ZopeTransactionExtension('changed'))
    

    【讨论】:

    • 它给了我以下错误:Task prepaid.models.Prepaid.PeriodicUpdateAgentLastRica[260cb057-c117-4c68-bb08-a55a169ce684] raised unexpected: AttributeError("'scoped_session' object has no attribute 'twophase'",)
    • 另一种方法是在执行操作之前将其标记为已更改。见上文。
    • 在我的情况下,它通过传递mark_changed(Session())
    猜你喜欢
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多