psql example_db psql (12.3) Type "help" for help. example_db=# example_db=# COPY example_db-# (select * from users) example_db-# TO '/Users/tracehelms/code/examples/users.csv' example_db-# WITH (format csv, header true); COPY 4 example_db=# \q ~/code/examples/ ❯ ls users.csv
pgcodekeeper cli
pgcodekeeper cli — эта утилита по поиску разницы между одной БД PostgreSQL и другой БД PostgreSQL. Позволяет выполнять операции сравнения через terminal.
Для начала необходимо установить Java SDK версии 17+ для вашей платформы.
Переходим на сайт GitHub и скачиваем последний релиз. На момент написания это 10.8.0
После скачивания файла pgCodeKeeper-cli-10.8.0.zip распаковываем результат в /opt/pgcodekeeper-cli (предварительно создаём её через mkdir -p pgcodekeeper-cli).

PostgreSQL: Performance of function call degrades after calling 5 calls in a row
Суть проблемы в том, что после того как функция будет создана, первые пять раз запрос выполняется быстро, но потом производительность резко падает.
Ниже описано решение.
I have this plpgsql function (running PG 14.5 on UBUNTU 18.04 with 8GB Ram) which returns 200 rows just fine:
db=# explain (analyze,buffers) Select * from f_client_getlistasshown('{"limit":"200","startdate":"2014-01-01","enddate":"2100-01-01","showRequiresActionFromTaxadvisor":false}'); -------------------------------------------------------------------------------------------------------------------------------- Function Scan on f_client_getlistasshown (cost=0.25..10.25 rows=1000 width=400) (actual time=69.515..69.529 rows=200 loops=1) Buffers: shared hit=8939 dirtied=1 Planning Time: 0.066 ms Execution Time: 70.282 ms (4 rows)Читать далее «PostgreSQL: Performance of function call degrades after calling 5 calls in a row»
PostgreSQL: автоматический план
# postgresql.conf session_preload_libraries = 'auto_explain' auto_explain.log_min_duration = '3s'
Или
postgres=# LOAD 'auto_explain'; postgres=# SET auto_explain.log_min_duration = 0; postgres=# SET auto_explain.log_analyze = true; postgres=# SELECT count(*) FROM pg_class, pg_index WHERE oid = indrelid AND indisunique;
В итоге в /var/log/postgresql будет план запроса
Обслуживание БД postgres через terminal
Реиндекс:
psql -U postgres -d "database_name" REINDEX DATABASE database_name;
Особенность работы Datalens в PostgreSQL. часть 2
Иногда при попытке запуска Datalens могут возникать странные проблемы отсутствия тех или иных объектов в БД (хотя они там есть).
Ошибка может быть связана в особенности PostgreSQL, когда по умолчанию схема public настроена, как «схема по умолчанию для вызова объектов».
Читать далее «Особенность работы Datalens в PostgreSQL. часть 2»Создание команды INSERT в PostgreSQL для таблиц
Данный способ позволяет создать скрипт INSERT для наполнения таблицы PostgreSQL.
pg_dump -a -U postgres -t table_name -f output_name.sql --inserts --column-inserts --on-conflict-do-nothing database_name
Описание параметров:
- a — Выгружаются только данные, а не схема (определения данных). Выгружаются табличные данные, большие объекты и значения последовательности. Этот параметр аналогичен, но по историческим причинам не идентичен параметру, определяющему
--section=data
. - U — Имя пользователя для подключения как.
- t — Дамп только таблиц с совпадающими именами
- f — Отправляйте выходные данные в указанный файл. Этот параметр можно опустить для файловых форматов вывода, в этом случае используется стандартный вывод. Однако он должен быть указан для формата вывода каталога, где указывается целевой каталог, а не файл. В этом случае каталог создан
pg_dump
и не должен существовать ранее. - inserts — Дамп данных в виде
INSERT
команд (а неCOPY
). Это сильно замедлит восстановление; в основном это полезно для создания дампов, которые можно загружать в базы данных, отличные от PostgreSQL. Любая ошибка во время восстановления приведет к потере только строк, которые являются частью проблемной таблицы,INSERT
а не всего содержимого таблицы. Обратите внимание, что восстановление может завершиться полным сбоем, если вы изменили порядок столбцов. Опция--column-inserts
защищает от изменений порядка столбцов, хотя и работает еще медленнее. - column-inserts — Дамп данных в виде
INSERT
команд с явными именами столбцов (INSERT INTO
). Это сильно замедлит восстановление; в основном это полезно для создания дампов, которые можно загружать в базы данных, отличные от PostgreSQL. Любая ошибка во время восстановления приведет к потере только строк, которые являются частью проблемной таблицыtable
(column
, ...) VALUES ...INSERT
, а не всего содержимого таблицы. - on-conflict-do-nothing — Добавить команды
ON CONFLICT DO NOTHING
вINSERT
. Этот параметр недопустим, если также не указано--inserts
,--column-inserts
или--rows-per-insert
.
Пример:
pg_dump -a -U postgres -t dbo.cs_point_types -f cs_point_types.sql --inserts --column-inserts --on-conflict-do-nothing skr-dev-db
python & postgresql
from sqlalchemy import create_engine, text
import pandas as pd
engine = create_engine('postgresql://user:password@host:5432/dbname')
conn = engine.connect()
query = text("""SELECT * FROM core.sd_settings""")
df = pd.read_sql_query(query, conn)
print(df.head())
conn.close()
Примечание: требуется установка следующих компонентов
# requirements.txt
SQLAlchemy
psycopg2
pandas
# pip install -r requirements.txt
Обновление массива jsonb в PostgreSQL
create or replace function update_array_elements(arr jsonb, key text, value jsonb)
returns jsonb language sql as $$
select jsonb_agg(jsonb_build_object(k, case when k <> key then v else value end))
from jsonb_array_elements(arr) e(e),
lateral jsonb_each(e) p(k, v)
$$;
select update_array_elements('[{"bar":true},{"bar":true}]'::jsonb, 'bar', 'false');
update_array_elements
----------------------------------
[{"bar": false}, {"bar": false}]
(1 row)
Чтение файлов из PostgreSQL
Примечание: данный способ не идеален, так как может быть создавать «дыру» в безопасности
Для чтения данных из файловой системы в postgresql требуется сохранить изображения в каталоге:
# psql SHOW data_directory; # /var/lib/postgresql/12/mainЧитать далее «Чтение файлов из PostgreSQL»