0

我想利用生成器来处理来自数据库查询的数据块,同时使用最少的内存(生成器的优势之一)。

我在使用生成器时发现的问题与这段代码有关:

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();
        }
    }
}

除了优化之外,这段代码的作用是:

  1. 检查我们是否有任何分配的 SQL 查询
  2. 检查是否给出了特定的 SQL 查询来执行(忽略任何其他)
  3. 如果给出了特定的 SQL 查询并且它存在,请执行它output()
  4. 如果没有给出特定的 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 操作。

4

0 回答 0