【问题标题】:SQL alchemy not updating as expectedSQLalchemy 未按预期更新
【发布时间】:2014-07-24 07:28:25
【问题描述】:

此 SQL Alchemy 0.9.7 代码可​​以正常执行,但不会按预期更新底层数据库。

这里是蟒蛇:

    print t        #prints TITLE ABSTRACTOR 1
    print newtitle #prints TITLE ABSTRACTOR I
    print session.query(Basic).filter(Basic.title==t).count() #prints 1
    ret = update(Basic).where(Basic.title==t).values(title=newtitle)
    session.commit()

这是更新后数据库的样子:

select count(*) from basics where title='TITLE ABSTRACTOR 1';
 count 
-------
     1
(1 row)

select count(*) from basics where title='TITLE ABSTRACTOR I';
 count 
-------
     0
(1 row)

我遇到了 SQL 炼金术错误还是我遗漏了什么?

【问题讨论】:

  • 你能给我们一个Minimal, Complete, Verifiable Example吗?
  • 另外,“.9”是指 0.9.0 吗?如果是这样,显而易见的做法是使用最新版本 (0.9.7) 进行测试。如果这可行,那么是的,你遇到了一个错误,并且该错误已被修复,你就完成了。如果没有,那么您仍然需要搜索错误报告或调试代码或希望其他人可以这样做,但至少人们不必拥有与您完全相同的旧版本。
  • @abarnert 我在 pip 上更新到最新版本,0.9.7。同样的问题。
  • 好的,这有帮助。但是我们仍然没有任何人都可以运行或阅读的示例(数据库转储、sqlalchemy 设置等),因此除非错误非常明显,否则没有人能为您做很多事情。我在上面提供的 MCVE 帮助链接确实可以帮助您获得更好的答案。
  • 等一下,说到非常明显的错误......我有一段时间没有使用 sqlalchemy,但update 不只是构造一个Update 对象,然后你必须调用@ 987654326@ 开启,还是传递给连接的execute 方法?

标签: python sqlalchemy


【解决方案1】:

你只是在构建一个更新语句:

ret = update(Basic).where(Basic.title==t).values(title=newtitle)

除非您执行该语句,否则不会执行任何操作:

stmt = update(Basic).where(Basic.title==t).values(title=newtitle)
ret = conn.execute(stmt)

但我认为您正在尝试使用 ORM 接口,而不是核心接口。在这种情况下,虽然我不记得细节,但我很确定您通过修改查询对象而不是通过调用任何名为 update 的东西来做到这一点。希望如果这是您正在寻找的东西,希望对此较新的人会提供更好的答案,但是像这样:

ret = session.query(Basic).filter(Basic.title==t)
ret.title = newtitle

如果这对您没有意义,请参阅教程中的 Executing。但我猜你知道这一点,这只是我们都犯的那些愚蠢的错误之一,而且所有人都很难在其他人的代码中看到,而且在我们自己的代码中要糟糕 100 倍。 :)

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2018-03-03
    相关资源
    最近更新 更多