Команда Postman Open Technologies собирает информацию о стандартах, отраслевых форматах и спецификациях, открытых API.
Каталог практик и паттернов оформлен как рабочее пространство Postman
На текущий момент там описаны следующие паттерны:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥3🆒2
IMG_20240315_000134_555.png
971 KB
Шпаргалка по SQL
JOIN, IN, LIKE, BETWEEN, ORDER BY и другое, ботай!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥3
📦 PyPI
docker pull apache/airflow:2.8.3
#airflow
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥3
Использование SELECT *
SELECT * FROM employees;
SELECT employee_id, first_name, last_name FROM employees;Отсутствие индексов
CREATE INDEX idx_last_name ON employees(last_name);
SELECT * FROM employees WHERE last_name = 'Smith';Чрезмерное использование подзапросов
SELECT department_name FROM departments WHERE department_id IN (SELECT department_id FROM employees);
SELECT DISTINCT d.department_name FROM departments d JOIN employees e ON d.department_id = e.department_id;Неэффективные JOIN
SELECT * FROM employees, departments;
SELECT e.employee_name, d.department_name FROM employees eНеиспользование выражений WHERE
INNER JOIN departments d ON e.department_id = d.department_id;
SELECT * FROM orders;
SELECT * FROM orders WHERE order_date >= '2023-01-01';Игнорирование планов выполнения запросов
EXPLAIN SELECT * FROM products WHERE category = 'Electronics';Отсутствие оптимизации больших наборов данных
SELECT * FROM products LIMIT 10 OFFSET 20;Повторяющиеся агрегации
SELECT department, SUM(salary) AS total_salary FROM employees GROUP BY department;
WITH DepartmentSalaries AS (Неадекватная обработка ошибок
SELECT department, SUM(salary) AS total_salary FROM employees GROUP BY department
)
SELECT * FROM DepartmentSalaries;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥8
BEGIN;
-- SQL выражение
IF some_condition THEN
ROLLBACK; -- Откат транзакции при ошибке
ELSE
COMMIT; -- Коммит транзакции при успешном выполнении всех выражений
END IF;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥4😁2
Временные таблицы в SQL обеспечивают удобный способ разбиения сложных задач на более мелкие и управляемые. Они позволяют разделить этапы обработки данных, что может повысить производительность, улучшить читаемость кода и упростить логику запросов.
CREATE TABLE
с ключевым словом TEMPORARY
или TEMP
перед именем таблицы:CREATE TEMPORARY TABLE my_temp_table (Детали:
id INT,
name VARCHAR(50),
age INT
);
CREATE TEMPORARY TABLE
используется для создания временной таблицы.my_temp_table
— это имя, которое присваивается временной таблице. Имя можно выбрать любое.my_temp_table
имеет три столбца: id
типа INT
, name
типа VARCHAR(50)
и age
типа INT
.Допустим, у тебя есть большой набор данных, и ты хочешь выполнить сложный анализ или вычисления на меньшей части этих данных. Для такого анализа можешь создать временную таблицу, содержащую только необходимые строки и столбцы.
CREATE TEMPORARY TABLE subset_data AS
SELECT column1, column2, column3
FROM original_table
WHERE condition;
SELECT column1, AVG(column2) AS average_value
FROM subset_data
GROUP BY column1;
DROP TABLE subset_data;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥5
Временные таблицы могут использоваться для оптимизации сложных или ресурсоемких запросов. Разбив сложный запрос на несколько этапов с помощью временных таблиц, ты можешь повысить производительность запроса.
Такое повышение происходит за счёт уменьшения объема данных, обрабатываемых на каждом этапе, или за счёт предварительного вычисления промежуточных результатов.
Временные таблицы позволяют хранить и повторно использовать промежуточные результаты запроса, избегая лишних вычислений. Пример:
CREATE TEMPORARY TABLE temp_results AS
SELECT column1, COUNT(*) AS count_value
FROM large_table
WHERE condition1
GROUP BY column1;
SELECT column1, column2
FROM temp_results
WHERE count_value > 10
ORDER BY column1;
DROP TABLE temp_results;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥3
Временные таблицы также полезны для подготовки и преобразования данных перед их загрузкой в постоянные таблицы.
Ты можешь создать временную таблицу, импортировать данные из различных источников, очистить их, применить преобразования и проверить данные перед их вставкой в конечный пункт назначения.
Временные таблицы обеспечивают гибкий и эффективный способ обработки и манипуляцией данными без изменения исходного набора. Пример:
CREATE TEMPORARY TABLE staging_table (
id INT,
name VARCHAR(50),
quantity INT
);
INSERT INTO staging_table (id, name, quantity)
SELECT id, UPPER(name), quantity * 2
FROM external_source;
UPDATE staging_table
SET quantity = 0
WHERE quantity < 0;
INSERT INTO final_table (id, name, quantity)
SELECT id, name, quantity
FROM staging_table;
DROP TABLE staging_table;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥3
Forwarded from Хитрый Питон
Мы у себя в компании начали аккуратно переходить на новый менеджер пакетов
Так как тула новая, пришлось ждать пока пофиксят 2 бага в которые мы упирались. После чего все равно не заработало, но проблема была уже на нашей стороне. Но самое главное, что после решения этих проблем все работает как часы уже вторую неделю 🙂
Все сложности были при использовании нескольких индексов:
- политика разрешения зависимостей
- авторы решили не переиспользовать переменную окружения
- в
Но какая же
1. Внутренняя библиотека (меньше 20 зависимостей)
- pip-tools 4 минуты 7 секунд
- с uv 10 секунд
2. Большой старый монолит на Django (больше 100 зависимостей):
- с pip-tools 18 минут 19 секунд
- с uv 32 секунды (!!!)
В общем я очень доволен результатом и рекомендую как минимум посмотреть на эту тулзу.
uv
(https://github.com/astral-sh/uv) и решил рассказать, как все идет.Так как тула новая, пришлось ждать пока пофиксят 2 бага в которые мы упирались. После чего все равно не заработало, но проблема была уже на нашей стороне. Но самое главное, что после решения этих проблем все работает как часы уже вторую неделю 🙂
Все сложности были при использовании нескольких индексов:
- политика разрешения зависимостей
uv
отличается от pip
- это важно, когда используется свой индекс в добавок к pypi- авторы решили не переиспользовать переменную окружения
PIP_EXTRA_INDEX_URL
- для uv
надо задавать UV_EXTRA_INDEX_URL
- в
UV_EXTRA_INDEX_URL
лушче прописывать `/simple`-индекс, у меня сначала было не так, pip работал, а uv уже нетНо какая же
uv
офигенно быстрая. Вот примеры двух наших разных проектов:1. Внутренняя библиотека (меньше 20 зависимостей)
- pip-tools 4 минуты 7 секунд
- с uv 10 секунд
2. Большой старый монолит на Django (больше 100 зависимостей):
- с pip-tools 18 минут 19 секунд
- с uv 32 секунды (!!!)
В общем я очень доволен результатом и рекомендую как минимум посмотреть на эту тулзу.
GitHub
GitHub - astral-sh/uv: An extremely fast Python package and project manager, written in Rust.
An extremely fast Python package and project manager, written in Rust. - astral-sh/uv
😁2🆒2❤🔥1
Кортежи с изменяемыми элементами могут быть источником ошибок. Объект допускает хеширование только тогда, когда его значение никогда не изменяется. Нехешируемый кортеж не может быть ни ключом словаря
dict
, ни элементом множества set
.hash
и сделать на её основе функцию is_fixed
, например такую:def is_fixed(obj) -> bool:#python #trix
try:
hash(obj)
except TypeError:
return False
return True
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥3
К посту выше. Важно не забывать, что неизменность кортежа относится только к хранящимся в нём ссылкам - их нельзя ни удалить, ни изменить. Но если какая-то ссылка указывает на изменяемый объект и этот объект будет изменён, то значение кортежа изменится.
Пример, изначально два кортежа равны:
a = (1, 'data engi', [8, 9])Получим результат:
b = (1, 'data engi', [8, 9])
print(a == b)
True
Но при внесении изменений в последний элемент кортежа
b
:b[-1].append(10)Получим результат:
print(a == b)
False
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥2🆒1
Скажем, тебе необходимо реализовать систему рассылки пуш-уведомлений на android-устройства клиентов. Ты пишешь сервис, который будет работать с FCM. Пишешь функции в своей БД, которые будут выдавать списки token-текст (да там много полей вообще).
Так вот, необходимо, чтобы такие ручки для разных модулей (бэкендов) лежали в отдельных схемах.
Предположим, что ты реализовал пункт выше, теперь твой сервис должен подключаться к БД и крутить свои запросы. Но под каким пользователем? Не будет же он бегать под postgres или admin?)
PostgreSQL — это мощная СУБД. Но и она не может быть универсальной. Не надо полагать, что всё делается штатными средствами PostgreSQL. Так-же не надо пробовать писать свои системы чего-либо.
Возьми за привычку в БД всегда хранить timestampTZ и когда-нибудь Тебе скажут большое спасибо за это.
Пользуйся
pg_stat_statements
Так-же рекомендую сразу установить расширения для мониторинга запросов (например
pg_stat_statements
)PostgreSQL всегда временные таблицы кладёт на диск, это занимает много времени. Используй табличные выражения. Да и лучше всё писать одним оператором.
Да да, партиции — это круто. Но вот их использовать я бы рекомендовал только в некоторых случаях
Да, когда планировщик не так представляет выхлоп — у тебя могут получиться очень медленные запросы.
Наверное сразу стоит добавить и тот пункт, что не надо хранить в TOAST, например json/text с дефолтным параметром хранения, аналитические данные.
#postgres
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥4
Forwarded from Записки kiriharu
В нашу жизнь проникает всё больше AI инструментов, поэтому делитесь в комментариях какими пользуетесь сами или о которых знаете.
Вот список из моих, юзаю практически каждый день:
- Очевидный ChatGPT
- Апскейлиг картиночек (старые мемы выглядят как новые!)
- Переводчик DeepL
- Поисковик Perplexity AI
- Нейросеть от Яндекса, которая кратко пересказывает содержимое статей и видео
- А вот тут мелкомягкие позволяют генерировать картиночки
- Вот тут я удаляю фон у фоточек
Вот список из моих, юзаю практически каждый день:
- Очевидный ChatGPT
- Апскейлиг картиночек (старые мемы выглядят как новые!)
- Переводчик DeepL
- Поисковик Perplexity AI
- Нейросеть от Яндекса, которая кратко пересказывает содержимое статей и видео
- А вот тут мелкомягкие позволяют генерировать картиночки
- Вот тут я удаляю фон у фоточек
🆒4
В книге рассказывается, как использовать, развёртывать и поддерживать Apache Spark с помощью этого всеобъемлющего руководства, написанного создателями фреймворка кластерных вычислений с открытым исходным кодом.
Книга, в которой подробно и доходчиво описаны все возможности Apache Hadoop.
В книге описаны принципы проектирования брокера больших данных Kafka, гарантии надёжности, ключевые API и архитектурные детали
В книге подробно рассказывается о Kubernetes - софт Google с открытым исходным кодом для автоматизации развёртывания, масштабирования и управления приложениями, масштабированием и управлением приложениями с большими данными
В этом руководстве объясняется, как СУБД Cassandra обрабатывает сотни терабайт данных, поддерживая высокую доступность данных в нескольких центрах обработки данных
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥6
Для версий
Python 3.10
и выше.Деструктуризация с помощью образцов настолько выразительна, что иногда даже наличие единственной ветви
case
может сделать код проще. Гвидо ван Россум собрал коллекцию примеров match/case
, один из которых назвал «Очень глубокий итерируемый объект и сравнение типа с выделением».Это здорово, но меня больше поразил тот факт, что можно проверять типы и насколько выразительно это выглядит, ниже смотри пример.
def write_value(self, value):
if isinstance(value, str):
self.simple_element("string", value)
elif value is True:
self.simple_element("true")
elif value is False:
self.simple_element("false")
elif isinstance(value, int):
if -1 << 63 <= value < 1 << 64:
self.simple_element("integer", "%d" % value)
else:
raise OverflowError(value)
elif isinstance(value, float):
self.simple_element("real", repr(value))
elif isinstance(value, dict):
self.write_dict(value)
elif isinstance(value, (bytes, bytearray)):
self.write_bytes(value)
elif isinstance(value, datetime.datetime):
self.simple_element("date", _date_to_string(value))
elif isinstance(value, (tuple, list)):
self.write_array(value)
else:
raise TypeError("unsupported type: %s" % type(value))
match/case
:def write_value(self, value):#python #casematch
match value:
case str():
self.simple_element("string", value)
case True:
self.simple_element("true")
case False:
self.simple_element("false")
case int():
if -1 << 63 <= value < 1 << 64:
self.simple_element("integer", "%d" % value)
else:
raise OverflowError(value)
case float():
self.simple_element("real", repr(value))
case dict():
self.write_dict(value)
case bytes() | bytearray():
self.write_bytes(value)
case datetime.datetime():
self.simple_element("date", _date_to_string(value))
case tuple() | list():
self.write_array(value)
case _:
raise TypeError("unsupported type: %s" % type(value))
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
patma/EXAMPLES.md at 3ece6444ef70122876fd9f0099eb9490a2d630df · gvanrossum/patma
Pattern Matching. Contribute to gvanrossum/patma development by creating an account on GitHub.
❤🔥3
CREATE TABLE colors (Если удалить запись с id равным двум и вставить ещё одну запись, то значением поля id будет 3. Автогенерация не связана с данными в таблице. Это отдельный счётчик, который всегда увеличивается. Так избегаются вероятные коллизии и ошибки, когда один и тот же идентификатор принадлежит сначала одной записи, а потом другой.
-- Одновременное использование и первичного ключа и автогенерации
id bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
name varchar(255)
);
INSERT INTO colors (name) VALUES ('Red'), ('Blue');
SELECT * FROM colors;
-- id name
-- 1 Red
-- 2 Blue
column_name type GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY[ ( sequence_option ) ]
Please open Telegram to view this post
VIEW IN TELEGRAM
🆒5❤🔥1