ZF2 небуферизованный SQL MySQL выбирает

У меня есть консольное приложение 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);

person James Stormes    schedule 25.05.2016    source источник


Ответы (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'];
}

Соединение Doctrine DBAL — данные поиск

person vbarinov    schedule 26.05.2016