代码之家  ›  专栏  ›  技术社区  ›  d2kagw

SQLAlchemy不返回所选数据

  •  1
  • d2kagw  · 技术社区  · 16 年前

    我正在使用SQLAlchemy作为我已经构建了一段时间的应用程序中的ORM。

    在我在一个缩放的环境中进行测试之前,一切都很好。 in_use '值,以确保其他人不会抓住入口。

    为了克服这个限制,我尝试将所有必需的处理放在一个语句中,并通过ORM的 execute() 方法,但SQLAlchemy拒绝返回查询结果。

    我的SQL语句是:

    SELECT id INTO @update_id FROM myTable WHERE in_use=0 ORDER BY id LIMIT 1 FOR UPDATE;
    UPDATE myTable SET in_use=1 WHERE id=@update_id;
    SELECT * FROM myTable WHERE id=@update_id;
    

    我在控制台中运行以下代码:

    engine = create_engine('mysql://<user details>@<server details>/myDatabase', pool_recycle=90, echo=True)
    result = engine.execute(sqlStatement)
    result.fetchall()
    

    只是为了得到这个结果

    []
    

    我确信该语句正在运行,因为我可以在数据库中看到更新生效,如果通过mysql终端或其他工具执行,我会返回修改后的行。 似乎是SQLAlchemy不想确认返回的行。

    干杯

    1 回复  |  直到 16 年前
        1
  •  3
  •   Denis Otkidach    16 年前

    您已经执行了3个查询,MySQLdb为每个查询创建了一个结果集。您必须获取第一个结果,然后调用 cursor.nextset() ,取第二个,依此类推。

    这回答了您的问题,但对您没有用处,因为它不会解决锁定问题。您必须首先了解FOR UPDATE的工作原理:它将返回的行锁定到事务结束。为避免长时间锁定等待,您必须使其尽可能短: SELECT ... FOR UPDATE , UPDATE SET in_use=1 ... , COMMIT execute() in_use (离线锁定)没有意义。当然你也可以用ORM做同样的事情。