Табл page php pg. Функции PostgreSQL. Безопасное изменение типа поля

В сети много руководств по PostgreSQL, которые описывают основные команды. Но при погружении глубже в работу возникают такие практические вопросы, для которых требуются продвинутые команды.

Такие команды, или сниппеты , редко описаны в документации. Рассмотрим несколько на примерах, полезных как для разработчиков, так и для администраторов баз данных.

Получение информации о базе данных

Размер базы данных

Чтобы получить физический размер файлов (хранилища) базы данных, используем следующий запрос:

SELECT pg_database_size(current_database());

Результат будет представлен как число вида 41809016 .

current_database() - функция, которая возвращает имя текущей базы данных. Вместо неё можно ввести имя текстом:

SELECT pg_database_size("my_database");

Для того, чтобы получить информацию в человекочитаемом виде, используем функцию pg_size_pretty:

SELECT pg_size_pretty(pg_database_size(current_database()));

В результате получим информацию вида 40 Mb .

Перечень таблиц

Иногда требуется получить перечень таблиц базы данных. Для этого используем следующий запрос:

SELECT table_name FROM information_schema.tables WHERE table_schema NOT IN ("information_schema","pg_catalog");

information_schema - стандартная схема базы данных, которая содержит коллекции представлений (views), таких как таблицы, поля и т.д. Представления таблиц содержат информацию обо всех таблицах баз данных.

Запрос, описанный ниже, выберет все таблицы из указанной схемы текущей базы данных:

SELECT table_name FROM information_schema.tables WHERE table_schema NOT IN ("information_schema", "pg_catalog") AND table_schema IN("public", "myschema");

В последнем условии IN можно указать имя определенной схемы.

Размер таблицы

По аналогии с получением размера базы данных размер данных таблицы можно вычислить с помощью соответствующей функции:

SELECT pg_relation_size("accounts");

Функция pg_relation_size возвращает объём, который занимает на диске указанный слой заданной таблицы или индекса.

Имя самой большой таблицы

Для того, чтобы вывести список таблиц текущей базы данных, отсортированный по размеру таблицы, выполним следующий запрос:

SELECT relname, relpages FROM pg_class ORDER BY relpages DESC;

Для того, чтобы вывести информацию о самой большой таблице, ограничим запрос с помощью LIMIT:

SELECT relname, relpages FROM pg_class ORDER BY relpages DESC LIMIT 1;

relname - имя таблицы, индекса, представления и т.п.
relpages - размер представления этой таблицы на диске в количествах страниц (по умолчанию одна страницы равна 8 Кб).
pg_class - системная таблица, которая содержит информацию о связях таблиц базы данных.

Перечень подключенных пользователей

Чтобы узнать имя, IP и используемый порт подключенных пользователей, выполним следующий запрос:

SELECT datname,usename,client_addr,client_port FROM pg_stat_activity;

Активность пользователя

Чтобы узнать активность соединения конкретного пользователя, используем следующий запрос:

SELECT datname FROM pg_stat_activity WHERE usename = "devuser";

Работа с данными и полями таблиц

Удаление одинаковых строк

Если так получилось, что в таблице нет первичного ключа (primary key), то наверняка среди записей найдутся дубликаты. Если для такой таблицы, особенно большого размера, необходимо поставить ограничения (constraint) для проверки целостности, то удалим следующие элементы:

  • дублирующиеся строки,
  • ситуации, когда одна или более колонок дублируются (если эти колонки предполагается использовать в качестве первичного ключа).

Рассмотрим таблицу с данными покупателей, где задублирована целая строка (вторая по счёту).

Удалить все дубликаты поможет следующий запрос:

DELETE FROM customers WHERE ctid NOT IN (SELECT max(ctid) FROM customers GROUP BY customers.*);

Уникальное для каждой записи поле ctid по умолчанию скрыто, но оно есть в каждой таблице.

Последний запрос требователен к ресурсам, поэтому будьте аккуратны при его выполнении на рабочем проекте.

Теперь рассмотрим случай, когда повторяются значения полей.

Если допустимо удаление дубликатов без сохранения всех данных, выполним такой запрос:

DELETE FROM customers WHERE ctid NOT IN (SELECT max(ctid) FROM customers GROUP BY customer_id);

Если данные важны, то сначала нужно найти записи с дубликатами:

SELECT * FROM customers WHERE ctid NOT IN (SELECT max(ctid) FROM customers GROUP BY customer_id);

Перед удалением такие записи можно перенести во временную таблицу или заменить в них значение customer_id на другое.

Общая форма запроса на удаление описанных выше записей выглядит следующим образом:

DELETE FROM table_name WHERE ctid NOT IN (SELECT max(ctid) FROM table_name GROUP BY column1, );

Безопасное изменение типа поля

Может возникнуть вопрос о включении в этот список такой задачи. Ведь в PostgreSQL изменить тип поля очень просто с помощью команды ALTER . Давайте для примера снова рассмотрим таблицу с покупателями.

Для поля customer_id используется строковый тип данных varchar . Это ошибка, так как в этом поле предполагается хранить идентификаторы покупателей, которые имеют целочисленный формат integer . Использование varchar неоправданно. Попробуем исправить это недоразумение с помощью команды ALTER:

ALTER TABLE customers ALTER COLUMN customer_id TYPE integer;

Но в результате выполнения получим ошибку:

ERROR: column “customer_id” cannot be cast automatically to type integer
SQL state: 42804
Hint: Specify a USING expression to perform the conversion.

Это значит, что нельзя просто так взять и изменить тип поля при наличии данных в таблице. Так как использовался тип varchar , СУБД не может определить принадлежность значения к integer . Хотя данные соответствуют именно этому типу. Для того, чтобы уточнить этот момент, в сообщении об ошибке предлагается использовать выражение USING , чтобы корректно преобразовать наши данные в integer:

ALTER TABLE customers ALTER COLUMN customer_id TYPE integer USING (customer_id::integer);

В результате всё прошло без ошибок:

Обратите внимание, что при использовании USING кроме конкретного выражения возможно использование функций, других полей и операторов.

Например, преобразуем поле customer_id обратно в varchar , но с преобразованием формата данных:

ALTER TABLE customers ALTER COLUMN customer_id TYPE varchar USING (customer_id || "-" || first_name);

В результате таблица примет следующий вид:

Поиск «потерянных» значений

Будьте внимательны при использовании последовательностей (sequence) в качестве первичного ключа (primary key): при назначении некоторые элементы последовательности случайно пропускаются, в результате работы с таблицей некоторые записи удаляются. Такие значения можно использовать снова, но найти их в больших таблицах сложно.

Рассмотрим два варианта поиска.

Первый способ
Выполним следующий запрос, чтобы найти начало интервала с «потерянным» значением:

SELECT customer_id + 1 FROM customers mo WHERE NOT EXISTS (SELECT NULL FROM customers mi WHERE mi.customer_id = mo.customer_id + 1) ORDER BY customer_id;

В результате получим значения: 5 , 9 и 11 .

Если нужно найти не только первое вхождение, а все пропущенные значения, используем следующий (ресурсоёмкий!) запрос:

WITH seq_max AS (SELECT max(customer_id) FROM customers), seq_min AS (SELECT min(customer_id) FROM customers) SELECT * FROM generate_series((SELECT min FROM seq_min),(SELECT max FROM seq_max)) EXCEPT SELECT customer_id FROM customers;

В результате видим следующий результат: 5 , 9 и 6 .

Второй способ
Получаем имя последовательности, связанной с customer_id:

SELECT pg_get_serial_sequence("customers", "customer_id");

И находим все пропущенные идентификаторы:

WITH sequence_info AS (SELECT start_value, last_value FROM "SchemaName"."SequenceName") SELECT generate_series ((sequence_info.start_value), (sequence_info.last_value)) FROM sequence_info EXCEPT SELECT customer_id FROM customers;

Подсчёт количества строк в таблице

Количество строк вычисляется стандартной функцией count , но её можно использовать с дополнительными условиями.

Общее количество строк в таблице:

SELECT count(*) FROM table;

Количество строк при условии, что указанное поле не содержит NULL:

SELECT count(col_name) FROM table;

Количество уникальных строк по указанному полю:

SELECT count(distinct col_name) FROM table;

Использование транзакций

Транзакция объединяет последовательность действий в одну операцию. Её особенность в том, что при ошибке в выполнении транзакции ни один из результатов действий не сохранится в базе данных.

Начнём транзакцию с помощью команды BEGIN .

Для того, чтобы откатить все операции, расположенные после BEGIN , используем команду ROLLBACK .

А чтобы применить - команду COMMIT .

Просмотр и завершение исполняемых запросов

Для того, чтобы получить информацию о запросах, выполним следующую команду:

SELECT pid, age(query_start, clock_timestamp()), usename, query FROM pg_stat_activity WHERE query != "" AND query NOT ILIKE "%pg_stat_activity%" ORDER BY query_start desc;

Для того, чтобы остановить конкретный запрос, выполним следующую команду, с указанием id процесса (pid):

SELECT pg_cancel_backend(procpid);

Для того, чтобы прекратить работу запроса, выполним:

SELECT pg_terminate_backend(procpid);

Работа с конфигурацией

Поиск и изменение расположения экземпляра кластера

Возможна ситуация, когда на одной операционной системе настроено несколько экземпляров PostgreSQL, которые «сидят» на различных портах. В этом случае поиск пути к физическому размещению каждого экземпляра - достаточно нервная задача. Для того, чтобы получить эту информацию, выполним следующий запрос для любой базы данных интересующего кластера:

SHOW data_directory;

Изменим расположение на другое с помощью команды:

SET data_directory to new_directory_path;

Но для того, чтобы изменения вступили в силу, требуется перезагрузка.

Получение перечня доступных типов данных

Получим перечень доступных типов данных с помощью команды:

SELECT typname, typlen from pg_type where typtype="b";

typname - имя типа данных.
typlen - размер типа данных.

Изменение настроек СУБД без перезагрузки

Настройки PostgreSQL находятся в специальных файлах вроде postgresql.conf и pg_hba.conf . После изменения этих файлов нужно, чтобы СУБД снова получила настройки. Для этого производится перезагрузка сервера баз данных. Понятно, что приходится это делать, но на продакшн-версии проекта, которым пользуются тысячи пользователей, это очень нежелательно. Поэтому в PostgreSQL есть функция, с помощью которой можно применить изменения без перезагрузки сервера:

SELECT pg_reload_conf();

Но, к сожалению, она применима не ко всем параметрам. В некоторых случаях для применения настроек перезагрузка обязательна.

.

Функции PostgreSQL

Postgres, разработанный в оригинале департаментом UC Berkeley Computer Science Department, был пионером многих объектно-ориентированных концепций, ставших теперь доступными в некоторых коммерческих БД. Он предоставляет поддержку языка SQL92/SQL99, целостности транзакций и расширяемости типов. PostgreSQL это открытый ресурс, потомок оригинального Berkeley-кода.

PostgreSQL database это открывает Source-продукт, доступный бесплатно. Для использования поддержки PostgreSQL вам необходим PostgreSQL 6.5 или новее. PostgreSQL 7.0 или новее - для всех возможностей модуля PostgreSQL. PostgreSQL поддерживает многие кодировки символов, включая кодировку многобайтных символов. Текущая версия и информация о PostgreSQL находятся на http://www.postgresql.org/ .

Чтобы включить поддержку PostgreSQL, необходима опция --with-pgsql[=DIR] при компиляции PHP. Если модуль совместно используемых/shared объектов доступен, PostgreSQL-модуль может быть загружен с использованием директивы extension в файле php.ini или функции dl() . Поддерживаемые ini-директивы описаны в файле php.ini-dist , поставляемом вместе с исходным кодом дистрибутива.


Предупреждение!

Имена PostgreSQL-функций будут изменены в релизе 4.2.0 для подтверждения соответствия существующим стандартам кодировки. Большая часть новых имён будет иметь дополнительные символы подчёркивания, например, pg_lo_open(). Некоторые функции переименовываются для обеспечения целостности. например, pg_exec() в pg_query(). Старые имена можно использовать в 4.2.0 и в некоторых релизах 4.2.0, но они могут быть удалены в будущем.

Таблица 1. Изменения имён функций
Старое имя Новое имя
pg_exec() pg_query()
pg_getlastoid() pg_last_oid()
pg_cmdtuples() pg_affected_rows()
pg_numrows() pg_num_rows()
pg_numfields() pg_num_fields()
pg_fieldname() pg_field_name()
pg_fieldsize() pg_field_size()
pg_fieldnum() pg_field_num()
pg_fieldprtlen() pg_field_prtlen()
pg_fieldisnull() pg_field_is_null()
pg_freeresult() pg_free_result()
pg_result() pg_fetch_result()
pg_loreadall() pg_lo_read_all()
pg_locreate() pg_lo_create()
pg_lounlink() pg_lo_unlink()
pg_loopen() pg_lo_open()
pg_loclose() pg_lo_close()
pg_loread() pg_lo_read()
pg_lowrite() pg_lo_write()
pg_loimport() pg_lo_import()
pg_loexport() pg_lo_export()

Не все функции поддерживаются во всех построениях/builds. Это зависит отверсии вашей libpq (The PostgreSQL C Client interface) и от того, как libpq скомпилирована. Если имеется отсутствующая функция, libpq не поддерживает возможности, требуемые для этой функции.

Важно также, чтобы вы использовали libpq более новую, чем PostgreSQL Server, с которым соединяетесь. Если вы используете libpq более старую, чем ожидает PostgreSQL Server, у вас будут проблемы.

Начиная с версии 6.3 (03/02/1998), PostgreSQL использует по умолчанию сокет домена unix. TCP-порт НЕ открывается по умолчанию. В таблице описаны эти новые возможности соединений. Этот сокет можно найти в in /tmp/.s.PGSQL.5432 . Данная опция может быть включена флагом "-i" для postmaster , и его значением будет: "прослушивать TCP/IP-сокеты, а также сокеты Unix-домена".

Таблица 2. Postmaster и PHP

Соединение с PostgreSQL-сервером может быть установлено следующими парами значений в командной строке: $conn = pg_connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser password=myPassword ") ;

Предыдущий синтаксис: $conn = pg_connect ("host", "port", "options", "tty", "dbname") теперь не рекомендуется.

Переменные окружения влияют на поведение PostgreSQL server/client. Например, PostgreSQL-модель будет искать переменную окружения PGHOST, если hostname отсутствует в строке соединения. Поддерживаемые переменные окружения отличаются в разных версиях. См. детали в PostgreSQL Programmer"s Manual (libpq - Environment Variables).

Убедитесь, что вы установили переменные окружения для соответствующего пользователя. Используйте $_ENV или getenv() для проверки того, какие переменные окружения доступны текущему процессу.

Начиная работу с PostgreSQL 7.1.0, вы можете сохранять 1GB в поле типа text. В более старых версиях могут быть ограничения на размер блоков (по умолчанию было 8KB, максимум был 32KB, определяемые на этапе компиляции).

Для использования интерфейса больших объектов/large object (lo) необходимо включать lo-функции внутри блока транзакции. Блок транзакции начинается с SQL-оператора BEGIN , и, если транзакция была верной, заканчивается COMMIT или END . Если транзакция терпит неудачу, она должна быть закрыта с помощью ROLLBACK или ABORT .

Вы не должны закрывать соединение с PostgreSQL-сервером до закрытия large object.

Содержание

pg_affected_rows - возвращает количество задействованных записей (пар/tuples) pg_cancel_query - отменяет async-запрос pg_client_encoding - получает клиентскую кодировку pg_close - закрывает a PostgreSQL-соединение pg_connect - открывает a PostgreSQL-соединение pg_connection_busy - получает, закрыто соединение или нет pg_connection_reset - восстанавливает соединение (reconnect) pg_connection_status - получает статус соединения pg_convert - конвертирует значение ассоциативного массива в значение, подходящее для оператора SQL pg_copy_from - вставляет записи в таблицу из массива pg_copy_to - копирует таблицу в массив pg_dbname - получает имя базы данных pg_delete - удаляет записи pg_end_copy - синхронизирует с PostgreSQL backend pg_escape_bytea - мнемонизирует/еscape binary для типа bytea pg_escape_string - мнемонизирует string для типа text/char pg_execute - Посылает запрос выполнить готовую инструкцию с данными параметрами, и ждет результата pg_fetch_all_columns - разбирает все строки в специфическом столбце результата как массив pg_fetch_all - разбирает все строки из результата как массив pg_fetch_array - извлекает ряд как массив pg_fetch_assoc - разбирает строку как ассоциативный массив pg_fetch_object - извлекает ряд как объект pg_fetch_result - возвращает значения из результирующего ресурса pg_fetch_row - получает ряд как перечислимый массив pg_field_is_null - проверяет, является ли поле NULL pg_field_name - возвращает имя поля pg_field_num - возвращает номер именованного поля pg_field_prtlen - возвращает печатаемый размер pg_field_size - возвращает внутренний размер хранения именованного поля pg_field_type - возвращает имя типа для соответствующего номера поля pg_field_type_oid - возвращает идентификатор типа (OID) для соответствующего номера поля pg_free_result - освобождает результирующую память pg_get_notify - получает предупреждающее сообщение SQL pg_get_pid - получет бэкэнд идентификатора процесса pg_get_result - получает результат асинхронного запроса pg_host - возвращает имя хоста, ассоциированного с соединением pg_insert - вставляет массив в таблицу pg_last_error - получает строку последнего сообщения об ошибке соединения pg_last_notice - возвращает последнее уведомление от PostgreSQL-сервера pg_last_oid - возвращает oid последнего объекта pg_lo_close - закрывает large object pg_lo_create - создаёт large object pg_lo_export - экспортирует large object в файл pg_lo_import - импортирует large object из файла pg_lo_open - открывает large object pg_lo_read_all - читает весь large object и отправляет его браузеру pg_lo_read - читает large object pg_lo_seek - ищет позицию large object"а pg_lo_tell - возвращает текущую позицию large object"а

С версии 6.3 (от 2 марта 1998 года) PostgreSQL использует сокеты домена UNIX. Этот сокет может быть найден в каталоге /tmp/.s.PGSQL.5432 . Это свойство может быть включено с помощью флага "-i" в postmaster и это означает "прослушивание сокетов TCP/IP", аналогично сокетам домена UNIX.

Таблица 1. Postmaster and PHP

Можно также установить соединение с помощью команды: $conn = pg_Connect("host=localhost port=5432 dbname=chris");

Для использования интерфейса больших объектов (large objects) необходимо заключить их в блок транзакции. Блок транзакции начинается begin и, если транзакция прошла успешно, завершается commit и end . Если транзакция дала сбой, то транзакция должна быть закрыта с помощью abort и rollback .

pg_Close

pg_Close -- закрывает соединение PostgreSQL
Описание
bool pg_close (int connection);

Возвращает false, если connection - не правильный номер соединения. Закрывает соединение с базой PostgreSQL, связанное с указанным номером соединения.

pg_cmdTuples

pg_cmdTuples -- возвращает число вызванных tuples
Описание
int pg_cmdtuples (int result_id);

pg_cmdTuples() возвращает число tuples (требований), вызванных запросами INSERT, UPDATE, и DELETE. Если нет вызванных tuple, то функция вернет 0.

Пример 1. pg_cmdtuples

pg_Connect

pg_Connect -- открывает соединение
Описание
int pg_connect (string host, string port, string options, string tty, string dbname);

Возвращает номер соединения при успехе или false, если соединение не может быть установлено. Открывает соединение с базой PostgreSQL. Каждый из аргументов должен быть в кавычках, включая номер порта. Аргементы options и tty являются дополнительными и могут быть опущены. Эта функция возвращает номер соединения, который необходим другим функциям PostgreSQL. Вы можете иметь одновременно несколько открытых соединений.

Соединение может быть также установлено следующей командой: $conn = pg_connect("dbname=marliese port=5432"); Дополнительные параметры (кроме dbname и port ) - это host , tty и options .

pg_DBname

pg_DBname -- имя базы данных
Описание
string pg_dbname (int connection);

Возвращает имя базы данных, с которой соединен указанный номер соединения PostgreSQL, или возвращает false, если указан не правильный номер соединения.

pg_ErrorMessage

pg_ErrorMessage -- сообщение об ошибке
Описание
string pg_errormessage (int connection);

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

pg_Exec

pg_Exec -- запускает запрос
Описание
int pg_exec (int connection, string query);

Возвращает признак результата, если запрос может быть запущен, false при ошибке или при неверном номере соединения. Детали об ошибке могут получены с помощью функции , если номер соединения верный. Функция посылает SQL запрос базе данных PostgreSQL, определяемой номером соединения. Connection должен быть верным номером соединения, который возвращается функцией . Возвращаемое этой функцией значение является необходимым для доступа к результатам других функций PostgreSQL.

Замечание: PHP2 возвращает 1, если запрос не должен возвращать данных (например, при вставке или обновлении) и больше 1, даже при выборках, которые ничего не возвращают. Таких допущений нет в PHP3.

pg_Fetch_Array

pg_Fetch_Array -- возвращает запись как массив
Описание
array pg_fetch_array (int result, int row);

Возвращает массив, который ссылается на полученную запись, или false если больше нет записей.

pg_fetch_array() является расширенной версией . В дополнение к хранению данных под числовыми индексами в результирующем массиве, функция также хранит данные под ассоциативными индексами, используя номера полей в качестве ключей.

Необходимо отметить, что функция pg_fetch_array() практически одинакова по скорости с , хотя и предоставляет дополнительные возможности.

Для дополнительной информации см.

Пример 1. Массив записи PostgreSQL

pg_Fetch_Object

pg_Fetch_Object -- возвращает запись как объект
Описание
object pg_fetch_object (int result, int row);

Возвращает объект со свойствами, которые ссылаются на полученную запись, или false если нет больше записей.

Пример 1. Полученние объекта Postgres

Ошибка соединения с базой

autor." ("; echo $data->jahr ."): "; echo $data->titel."
"; $row++; endwhile; ?>
$item."\n";
 endwhile;
 $row++;
endwhile;
echo "----------\n"; ?>

pg_Fetch_Row

pg_Fetch_Row -- получает запись как нумерованный массив
Описание
array pg_fetch_row (int result, int row);

Возвращает массив, который ссылается на полученную запись, или false, если больше нет записей.

pg_fetch_row() возвращает одну запись данных из результата, определяемого указанным идентификатором результата. Запись возвращается как массив. Каждый столбец результата храниться в элементе массива, начиная с 0.

Последующий вызов функции pg_fetch_row() возвратит следующую запись в результирующем наборе, или false, если записей больше нет.

pg_FieldIsNull

pg_FieldIsNull -- Проверяет поле на нулевое значение
Описание
int pg_fieldisnull (int result_id, int row, mixed field);

Проверяет нулевое (NULL) значение у поля или нет. Возвращает 0, если поле в указанной записи не нулевое. Возвращает 1, если поле ы указанное записи нулевое. Поле может определяться номером или именем. Нумерация записей начинается с 0.

pg_FieldName

pg_FieldName -- возвращает имя поля
Описание
string pg_fieldname (int result_id, int field_number);

pg_FieldName() возвращет имя поля, соответствующее указанному номеру столбца в указанном идентификаторе результата PostgreSQL. Нумерация полей начинается с 0.

pg_FieldNum

pg_FieldNum -- возвращает номер столбца
Описание
int pg_fieldnum (int result_id, string field_name);

pg_FieldNum() возвращает номер столбца, соответствующий указанному имени поля в указанном идентификаторе результата PosgreSQL. Нумерация полей начинается с 0. Функция вернет -1 при ошибке.

pg_FieldPrtLen

pg_FieldPrtLen -- Возвращает печатную длину
Описание
int pg_fieldprtlen (int result_id, int row_number, string field_name);

pg_FieldPrtLen() возвращает действительную печатную длину (число символов) указанных данных в результате PosgreSQL. Нумерация записей начинается с 0. При ошибке функция вернет -1.

pg_FieldSize

pg_FieldSize -- возвращает внутренний размер хранения именованного поля
Описание
int pg_fieldsize (int result_id, string field_name);

pg_FieldSize() возвращает внутренний размер хранения указанного именованного поля в указанном результате PosgreSQL. Размер поля -1 говорит о переменной длине поля. Эта функция вернет false при ошибке.

pg_FieldType

pg_FieldType -- возвращает тип соответствующего именованного поля
Описание
int pg_fieldtype (int result_id, int field_number);

pg_FieldType() возвращает строку, содержащую имя типа указанного поля в указанном идентификаторе результата PosgreSQL. Нумерация полей начинается с 0.

pg_FreeResult

pg_FreeResult -- освобождает память
Описание
int pg_freeresult (int result_id);

pg_locreate

pg_locreate -- создает большой объект
Описание
int pg_locreate (int conn);

pg_locreate() создает отображение большого объекта (ILO) и возвращает идентификатор большого объекта. conn определяет верное соединение с базой данных. Режимы доступа PostgreSQL INV_READ, INV_WRITE, и INV_ARCHIVE не поддерживаются, объект создается всегда и для чтения и для записи. INV_ARCHIVE был удален из самой PostgreSQL (версии 6.3 и выше).

pg_loopen

pg_loopen -- открывает большой объект
Описание
int pg_loopen (int conn, int objoid, string mode);

pg_loopen() открывает отображение большого объекта (ILO) и возвращает дескриптор файла большого объекта. Дескриптор файла содержит информацию о соединении. Не закрывайте соединение до закрытия дескриптора файла большого объекта. objoid определяет верный идентификатор большого объекта и mode может быть одним из "r", "w", or "rw".

pg_loread

pg_loread -- считывает большой объект
Описание
string pg_loread (int fd, int len);

pg_loread() считывает len байтов из большого объекта и возвращает их в виде строки. fd определяет верный декскриптор файла большого объекта len определяет максимально возможный размер сегмента большого объекта.

pg_loreadall

pg_loreadall -- считывает весь большой объект
Описание
void pg_loreadall (int fd);

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

pg_lounlink

pg_lounlink -- удаляет большой объект
Описание
void pg_lounlink (int conn, int lobjid);

pg_lounlink() удаляет большой объект с идентификатором большого объекта lobjid .

pg_lowrite

pg_lowrite -- записывает в большой объект
Описание
int pg_lowrite (int fd, string buf);

pg_lowrite() записывает данные в большой объект из переменной buf и возвращает число записанных данных или false при ошибке. fd является дескриптором файла большого объекта из функции .

pg_NumFields

pg_NumFields -- возвращает количество полей
Описание
int pg_numfields (int result_id);

pg_NumFields() возвращает количестов полей (столбцов) в результате PostgreSQL. Параметр является верным идентификатором результата, полученным функцией . Эта функция вернет -1 при ошибке.

pg_NumRows

pg_NumRows -- возвращает число записей
Описание
int pg_numrows (int result_id);

Соединение может также быть установлено следующей командой: $conn = pg_pconnect("dbname=marliese port=5432"); Остальные параметры, кроме dbname и port , - это host , tty и options .

pg_Port

pg_Port -- возвращает номер порта
Описание
int pg_port (int connection_id);

pg_Port() возвращает номер порта, с которым соединен указанный идентификатор соединения PostgreSQL.

pg_Result

pg_Result -- возвращает данные из идентификатора результата
Описание
mixed pg_result (int result_id, int row_number, mixed fieldname);

pg_Result() возвращает данные из идентификатора результата, полученного . Параметры row_number и fieldname определяют, из какой ячейки таблицы будут взяты данные. Нумерация записей и полей начинается с 0. Вместо имени поля вы можете использовать номер поля (без кавычек).

PostgreSQL имеет много видов данных, но здесь поддерживаются только основные. Все виды целых и логических типов, типов идентификаторов возвращаются как целые числа. Все виды типов с плавающей точкой и действительных чисел возвращаются как тип double. Все осталные типы, включая массивы возвращаются как строки, отформатированные в том же виде, какой вы видели в программе psql .

pg_tty

pg_tty -- возвращает имя tty
Описание
string pg_tty (int connection_id);

pg_tty() возвращает имя tty, которое сервер дает указанному идентификатору соединения PostgreSQL.

Postgres, разработанный в оригинале департаментом UC Berkeley Computer Science Department, был пионером многих объектно-ориентированных концепций, ставших теперь доступными в некоторых коммерческих БД. Он предоставляет поддержку языка SQL92/SQL99, целостности транзакций и расширяемости типов. PostgreSQL это открытый ресурс, потомок оригинального Berkeley-кода.

PostgreSQL это продукт, доступный бесплатно. Для использования поддержки PostgreSQL вам необходим PostgreSQL 6.5 или новее. PostgreSQL 7.0 или новее - для всех возможностей модуля PostgreSQL. PostgreSQL поддерживает многие кодировки символов, включая кодировку многобайтных символов. Текущая версия и информация о PostgreSQL находятся на http://www.postgresql.org/ .

Чтобы включить поддержку PostgreSQL, необходима опция --with-pgsql[=DIR] при компиляции PHP. Если модуль совместно используемых/shared объектов доступен, PostgreSQL-модуль может быть загружен с использованием директивы extension в файле php.ini или функции dl() . Поддерживаемые ini-директивы описаны в файле php.ini-dist , поставляемом вместе с исходным кодом дистрибутива.

Таблица 1. Изменения имён функций
Старое имя Новое имя
pg_exec() pg_query()
pg_getlastoid() pg_last_oid()
pg_cmdtuples() pg_affected_rows()
pg_numrows() pg_num_rows()
pg_numfields() pg_num_fields()
pg_fieldname() pg_field_name()
pg_fieldsize() pg_field_size()
pg_fieldnum() pg_field_num()
pg_fieldprtlen() pg_field_prtlen()
pg_fieldisnull() pg_field_is_null()
pg_freeresult() pg_free_result()
pg_result() pg_fetch_result()
pg_loreadall() pg_lo_read_all()
pg_locreate() pg_lo_create()
pg_lounlink() pg_lo_unlink()
pg_loopen() pg_lo_open()
pg_loclose() pg_lo_close()
pg_loread() pg_lo_read()
pg_lowrite() pg_lo_write()
pg_loimport() pg_lo_import()
pg_loexport() pg_lo_export()

Не все функции поддерживаются во всех построениях/builds. Это зависит от версии вашей libpq (The PostgreSQL C Client interface) и от того, как libpq скомпилирована. Если имеется отсутствующая функция, libpq не поддерживает возможности, требуемые для этой функции.

Важно также, чтобы вы использовали libpq более новую, чем PostgreSQL Server, с которым соединяетесь. Если вы используете libpq более старую, чем ожидает PostgreSQL Server, у вас будут проблемы.

Начиная с версии 6.3 (03/02/1998), PostgreSQL использует по умолчанию сокет домена unix. TCP-порт НЕ открывается по умолчанию. В таблице описаны эти новые возможности соединений. Этот сокет можно найти в in /tmp/.s.PGSQL.5432 . Данная опция может быть включена флагом "-i" для postmaster , и его значением будет: "прослушивать TCP/IP-сокеты, а также сокеты Unix-домена".

Таблица 2. Postmaster и PHP

Соединение с PostgreSQL-сервером может быть установлено следующими парами значений в командной строке: $conn = pg_connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser password=myPassword ") ;

Предыдущий синтаксис: $conn = pg_connect ("host", "port", "options", "tty", "dbname") теперь не рекомендуется.

Переменные окружения влияют на поведение PostgreSQL server/client. Например, PostgreSQL-модуль будет искать переменную окружения PGHOST, если hostname отсутствует в строке соединения. Поддерживаемые переменные окружения отличаются в разных версиях. См. детали в PostgreSQL Programmer"s Manual (libpq - Environment Variables).

Убедитесь, что вы установили переменные окружения для соответствующего пользователя. Используйте $_ENV или getenv() для проверки того, какие переменные окружения доступны текущему процессу.

Начиная работу с PostgreSQL 7.1.0, вы можете сохранять 1GB в поле типа text. В более старых версиях могут быть ограничения на размер блоков (по умолчанию было 8KB, максимум был 32KB, определяемые на этапе компиляции).

Для использования интерфейса больших объектов/large object (lo) необходимо включать lo-функции внутри блока транзакции. Блок транзакции начинается с SQL-оператора BEGIN , и, если транзакция была верной, заканчивается COMMIT или END . Если транзакция терпит неудачу, она должна быть закрыта с помощью ROLLBACK или ABORT .

Вы не должны закрывать соединение с PostgreSQL-сервером до закрытия large-объекта.

Содержание pg_affected_rows - возвращает количество задействованных записей (пар/tuples) pg_cancel_query - отменяет async-запрос pg_client_encoding - получает клиентскую кодировку pg_close - закрывает PostgreSQL-соединение pg_connect - открывает PostgreSQL-соединение pg_connection_busy - получает, закрыто соединение или нет pg_connection_reset - восстанавливает соединение (reconnect) pg_connection_status - получает статус соединения pg_convert - конвертирует значение ассоциативного массива в значение, подходящее для оператора SQL pg_copy_from - вставляет записи в таблицу из массива pg_copy_to - копирует таблицу в массив pg_dbname - получает имя базы данных pg_delete - удаляет записи pg_end_copy - синхронизирует с PostgreSQL backend pg_escape_bytea - мнемонизирует/еscape binary для типа bytea pg_escape_string - мнемонизирует string для типа text/char pg_fetch_array - извлекает ряд как массив pg_fetch_object - извлекает ряд как объект pg_fetch_result - возвращает значения из результирующего ресурса pg_fetch_row - получает ряд как перечислимый массив pg_field_is_null - проверяет, является ли поле NULL pg_field_name - возвращает имя поля pg_field_num - возвращает номер именованного поля pg_field_prtlen - возвращает печатаемый размер pg_field_size - возвращает внутренний размер хранения именованного поля pg_field_type - возвращает имя типа для соответствующего номера поля pg_update (resource $connection , string $table_name , array $data , array $condition [, int $options = PGSQL_DML_EXEC ])

pg_update() заменяет записи в таблице, удовлетворяющие условиям condition данными data . Если задан аргумент options , данные будут преобразованы функцией pg_convert() , которой будут переданы параметры из этого аргумента.

Список параметров

Ресурс соединения с базой данных PostgreSQL.

Table_name

Имя таблицы, в которой обновляются записи.

Массив (array ), ключи которого соответствуют именам колонок таблицы table_name , а значения заменят данные в этих колонках.

Condition

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

Options

Одна из констант PGSQL_CONV_OPTS , PGSQL_DML_NO_CONV , PGSQL_DML_ESCAPE , PGSQL_DML_EXEC , PGSQL_DML_ASYNC или PGSQL_DML_STRING , либо их комбинация. Если options содержит PGSQL_DML_STRING , функция вернет строку. Если установлены PGSQL_DML_NO_CONV или PGSQL_DML_ESCAPE , то функция pg_convert() внутренне не вызывается.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Функция вернет строку (string ), если константа PGSQL_DML_STRING содержится в options .

Примеры

Пример #1 Пример использования pg_update()

$db = pg_connect ("dbname=foo" );
$data = array("field1" => "AA" , "field2" => "BB" );

// Это безопасно с тех пор как $_POST преобразуется автоматически
$res = pg_update ($db , "post_log" , $_POST , $data );
if ($res ) {
echo "Данные обновлены: $res \n" ;
} else {
echo "Должно быть переданы неверные данные\n" ;
}
?>

Обзоры