ZF2 небуферизованный SQL MySQL select
У меня есть консольное приложение ZF2, где мне нужно прочитать восемь миллионов записей в базе данных MySQL.
Я пытаюсь выполнить небуферизованный запрос MySQL, но я не могу найти правильный путь, используя эфир Zend\Db\TableGateway\TableGateway или, более прямо, используя Zend\Db\Adapter\Adapter, возможно, я смотрю не в том месте?
Я ищу подходящий пример чтения миллионов строк с использованием Zend Framework 2.
После долгих, долгих и долгих сеансов с отладчиком и чтения кода ZF2 я обнаружил, что следующее дает мне желаемое поведение.
// Get a database adapter for the source (defalut) db
$SourceAdapter = $sm->get('Zend\Db\Adapter\Adapter');
// Turn off source database buffering.
$SourceAdapter->getDriver()
->getConnection()
->getResource()
->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,false);
$SourceAdapter->getDriver()
->getConnection()
->getResource()
->setAttribute(\PDO::CURSOR_FWDONLY,true);
1 ответ
Посмотрите на буферизованные и небуферизованные запросы
Если вы используете драйвер PDOMySql, укажите опцию отключения буферизованного запроса в конфигурации соединения (doctrine.local.php
):
<?php
return [
'doctrine' => [
'connection' => [
'orm_default' => [
'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
'params' => [
'host' => 'localhost',
'port' => '3306',
'user' => 'root',
'password' => '',
'dbname' => 'dbname',
'charset' => 'utf8',
'driverOptions' => [
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false
],
],
],
],
],
];
Ты можешь использовать \Doctrine\DBAL\Connection
чтобы получить данные, например, в вашем коде:
/* @var \Doctrine\DBAL\Connection $connection */
$connection = $this->getServiceLocator()->get('doctrine.connection.orm_default');
$sql = 'SELECT * FROM Records';
$stmt = $connection->query($sql);
while ($row = $stmt->fetch()) {
echo $row['id'];
}