我想利用生成器来处理来自数据库查询的数据块,同时使用最少的内存(生成器的优势之一)。
我在使用生成器时发现的问题与这段代码有关:
if (!empty($this->attributes["queries"])) {
if (!empty($query)) {
if (!empty($this->attributes["queries"][$query])) {
$this->attributes["queries"][$query]->output();
}
} else {
foreach ($this->attributes["queries"] as $query) {
$query->output();
}
}
}
除了优化之外,这段代码的作用是:
- 检查我们是否有任何分配的 SQL 查询
- 检查是否给出了特定的 SQL 查询来执行(忽略任何其他)
- 如果给出了特定的 SQL 查询并且它存在,请执行它
output()
- 如果没有给出特定的 SQL 查询,则遍历所有 SQL 查询并执行它们
output()
问题是这对于任何类型的 SQL 查询都完美无缺,除了最常用的查询:SELECT
.
问题出在这段代码中:
if (!empty($query)) {
if (!empty($this->attributes["queries"][$query])) {
if ($this->attributes["queries"][$query]->attributes["type"] === "SELECT") {
if ($output = $this->attributes["link"]->prepare($this->attributes["queries"][$query]->attributes["query"], [\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY])) {
if ($output->execute(!empty($this->attributes["queries"][$query]->attributes["parameters"]) ? $this->attributes["queries"][$query]->attributes["parameters"] : null)) {
while ($row = $output->fetch(\PDO::FETCH_ASSOC)) {
yield $row;
}
}
}
}
}
}
该方法(调用input
它以将其与执行任何其他功能的方法区分开来output
)遵循相同的逻辑。
- 检查指定的 SQL 查询是否存在
- 准备指定为查询/参数对的 SQL 查询
- 执行 SQL 查询和
yield
结果
我在这里有点迷路,所以我想对这个主题有所了解。似乎产生任何数据行会使任何其他执行分支不可用(我可以执行任意数量的SELECT
查询,但没有事务操作有效(CREATE
, INSERT
,UPDATE
等只是没有发出或执行但没有提交)。
你能给我(或帮助我设计)一段伪代码来反映正确的模式吗?即使我使用 PHP 5.5 编写了很多代码,仍然有一些我不知道或没有经历过的事情,所以非常感谢您的帮助:)
编辑:我对input()
andoutput()
方法的意思是我的方案目前有效,但只有当我将SELECT
查询分成自己的input()
方法时(因此使用生成器不会破坏其他 SQL 查询)并将该output()
方法留给任何其他 SQL 操作。