【发布时间】:2012-08-29 05:03:42
【问题描述】:
遇到了一个令人困惑的大问题。我正在使用 Laravel(3.2.5 和现在的 3.2.7)并且我正在使用 Eloquent ORM 来更新数据库(PostgreSQL)。
这就是我正在做的事情:
- 我有一个充满数据的数据库
- 我正在从外部 API 提取信息以更新我的数据库中的完整数据
- 我运行了一个脚本,将充满数据的数据库放入数组中,并且与 API 相同。这是比较
- 我用一个充满变化的数组填充一个数据对象
- 我“保存”它
- 什么也没发生-.-
我使用了一些日志记录和调试工具栏来确定发生了 wtf。这是信息:
- 所有 SQL 查询都会运行以更新正确的信息。当通过 phpPgAdmin 运行查询时,它会按应有的方式更新。这里的问题是查询更新了行中的每一列,而不仅仅是更改。使用“更新”而不是“填充/保存”会产生同样的问题。
- 永远不会更新任何表信息。
- 第一个日志显示链接文本不相等。这没关系,因为它表明 link_text 需要更新。但是,它清楚地表明下次我运行脚本时没有更新任何内容。日志每次都显示相同的信息,并且发生的日志事件也一样多。
- 第二个日志显示整个对象是脏的,而不仅仅是应该更新的对象。这就是更新 SQL 的原因
- 第三个日志准确地吐出了应该更新的内容。最多 3-5 列,仅此而已。而且格式正确。
知道为什么,首先,即使 Laravel 将 SQL 标记为正在运行并显示正确的查询,数据库也没有得到更新?
另外,知道为什么 ENTIRE 对象是脏的并且查询尝试更新整个对象(23 列以上)而不是只更新更改(3-5 列)吗?
【问题讨论】:
-
第一个问题听起来像自动提交/事务问题。你在做这项工作吗?
-
据我所知,Laravel 会自动执行此操作;但是,我可能错了。您将如何提交更新?您会在每个 SQL 查询之后还是在整个脚本完成之后执行此操作?也很好抓。甚至没有想到,只是假设 Laravel 会自动执行此操作。
-
不知道,我不做PHP,不知道Laravel除了标签描述之外还有什么。未提交事务的问题只是“SQL 运行但数据未出现在数据库中”问题的常见原因。也许在
postgresql.conf中启用log_statement='all'和log_line_prefix='%d %p',看看是否可以在日志中不匹配COMMITs 的情况下找到BEGINs?或者查看pg_stat_activity看看是否有<IDLE> in transaction条目?它们的存在强烈暗示了悬空交易;他们的缺席并不排除他们,只有日志检查才能做到这一点。
标签: php postgresql laravel laravel-3