Использует ли PHP pg_fetch_assoc() итератор/курсор?

Функционирует ли PHP pg_fetch_assoc() внутри

использовать итератор/курсор или он получает все данные сразу по сети?

Будет ли \PDO использовать курсор?

Мой контекст извлекает большой объем данных, и я хочу знать, извлекаются ли они целиком или построчно (или ограниченно построчно, когда курсор содержит подмножество полного набора данных).


person Daniel W.    schedule 21.01.2020    source источник
comment
По моему опыту, он извлекает все сразу, потому что я получил ошибки выделения памяти, используя его, если я получил слишком много строк. Однако версии fetch_assoc для MySQL и ORA никогда не давали мне ошибок выделения памяти. Отказ от ответственности: я не использовал функции PG с 2009 года, поэтому сейчас реализация функции может быть другой.   -  person kainaw    schedule 21.01.2020
comment
re: ваше редактирование - память выделяется на возврат или на прохождение?   -  person treyBake    schedule 21.01.2020
comment
@treyBake извлекает ли весь набор данных с сервера базы данных или только данные в курсоре (я не отрицал ваш ответ); (изменена формулировка с выделения памяти на получение данных целиком или частично);   -  person Daniel W.    schedule 21.01.2020
comment
@ДэниелВ. я полагаю, что данные в курсоре, поскольку мы передаем результат $ в качестве параметра вместо того, чтобы создавать все это в функции :)   -  person treyBake    schedule 22.01.2020


Ответы (2)


pg_fetch_assoc() не делает ни того, ни другого. Это функция, которая извлекает ассоциативный массив из ресурса PHP. Ресурс может быть, например, результатом вызова PQexecPrepared.

На уровне API PHP-pgsql не имеет функций курсора. Вы можете попробовать использовать PDO, который эмулирует курсоры для PostgreSQL, если вы включите режим прокручиваемого курсора. См. prepare() для получения более подробной информации. Другой альтернативой является просто использование SQL операторы курсора самостоятельно.

Этот ответ объясняет немного больше: php postgres от запроса до выборки строк в теории

Вот ссылка на исходный код PDO, который отвечает за эмуляцию курсоров с операторами SQL.

person Dharman    schedule 22.01.2020

Данные передаются через $result:

(Взято из открывающегося файла pgsql.php (CTRL + Click по имени функции в PHPStorm)):

/**
 * Fetch a row as an associative array
 * @link https://php.net/manual/en/function.pg-fetch-assoc.php
 * @param resource $result <p>
 * PostgreSQL query result resource, returned by <b>pg_query</b>,
 * <b>pg_query_params</b> or <b>pg_execute</b>
 * (among others).
 * </p>
 * @param int $row [optional] <p>
 * Row number in result to fetch. Rows are numbered from 0 upwards. If
 * omitted or <b>NULL</b>, the next row is fetched.
 * </p>
 * @return array An array indexed associatively (by field name).
 * Each value in the array is represented as a
 * string. Database NULL
 * values are returned as <b>NULL</b>.
 * </p>
 * <p>
 * <b>FALSE</b> is returned if <i>row</i> exceeds the number
 * of rows in the set, there are no more rows, or on any other error.
 * @since 4.3
 * @since 5.0
 */
function pg_fetch_assoc ($result, $row = null) {}

Строки в $result представляют собой пронумерованный массив/объект, содержащий все данные, которые у него есть. Он просто возвращает строку в этом массиве/объекте, поэтому он обрабатывает любые данные в переданном курсоре. Мы можем получить это из одной из строк приведенного выше кода (отформатирован для лучшего чтения):

@param resource $result
Ресурс результата запроса PostgreSQL, возвращаемый
pg_query, pg_query_params или pg_execute

person treyBake    schedule 21.01.2020
comment
Это правильный ответ, но я думаю, что вы немного упустили момент. Читая между строк, я думаю, что OP хочет знать, как использовать режим курсора с API PG. - person Dharman; 22.01.2020
comment
@Dharman ааа, иногда я слишком буквален, ха-ха :) Я подожду, пока OP прокомментирует / ответит, и внесу соответствующие поправки (если смогу) :) - person treyBake; 22.01.2020