Запуск функции очистки электронной почты

Отрывок из статьи Высокая производительность PostgreSQL для Rails Эндрю Аткинсона.

Для вашей первой функции очистки вы очистите значение столбца users таблицы email. Этот столбец имеет тип varchar, а адреса электронной почты имеют различные домены, например gmail.com. Цель вашего дизайна — сохранить часть домена электронной почты, поскольку она не идентифицирует человека уникальным образом, а заменить первую часть перед символом @.

Для этого вы создадите функцию базы данных под названием scrub_email(), используя встроенные функции SQL. Как разработчик Rails, вы, возможно, раньше не писали функции базы данных. Не волнуйтесь, вы постепенно познакомитесь с этим.

Функции PostgreSQL можно писать с помощью SQL (LANGUAGE SQL). Для более сложных потребностей существует встроенный процедурный язык под названием PL/pgSQL. Процедурный язык доступен как расширение. Запустив psql\dx, вы увидите в списке расширение plpgsql.

Для функций SQL PostgreSQL вызывает эти функции Языка запросов (SQL). Функции SQL имеют некоторые возможности, аналогичные написанию методов Ruby, например, переменное количество аргументов и аргументы по умолчанию. Стоит начать с функций SQL, потому что они менее сложны, а затем перейти к PL/pgSQL, если вам нужно устанавливать переменные и использовать условные ветвления и циклы в ваших функциях.

Начните со скелетной структуры без реализации, чтобы вы могли изучить основы.

сигнатура функции принимает один аргумент. Аргумент\ должен быть типа varchar и возвращать текстовую строку varchar.

Запустите psql со своего терминала и введите следующую структуру функции:

CREATE OR REPLACE FUNCTION scrub_email(email_address varchar(255)) RETURNS varchar(255) AS $$
SELECT
email_address;
$$ LANGUAGE SQL;

CREATE OR REPLACE FUNCTION создает именованную функцию или перезаписывает ту, которая была определена с тем же именем и аргументами. Функция принимает аргумент email_address типа varchar(255). Тип аргумента важен, поскольку вашим аргументом будут значения столбцов базы данных определенных типов, а тип столбца должен точно соответствовать принятому типу аргумента.

Эта функция пока ничего не делает. Обратите внимание, что он просто вызывает SELECT для вашего входного значения.

После того как вы вставили тело функции в psql, вы можете вызвать ее с помощью SELECT:

SELECT scrub_email(email) FROM users;

Хороший! Это основы функции SQL. Вы можете использовать функции для создания операторов SQL. Вы даже можете вывести вещи на другой уровень с помощью переменных и циклов.

Определенные вами функции являются исходным кодом, как и код вашего приложения Rails, поэтому вам нужно держать их под контролем версий и управлять их жизненным циклом. У вас есть несколько вариантов. Вы можете хранить свои функции в приложении Rails в каталоге с именем db/functions. Отсюда вы можете управлять изменениями, но функции не будут автоматически добавлены в вашу базу данных.

Поскольку вы работаете с Rails, воспользуйтесь драгоценным камнем fx Ruby (функции базы данных и триггеры с поддержкой версий для Rails5), который поможет вам управлять жизненным циклом ваших функций. fx предоставляет генератор Rails, который генерирует файл SQL, в который вы можете поместить свою функцию, а также файл миграции для ее добавления.

Вам не нужно запускать это сейчас, но пример генератора функций fx:

bin/rails generate fx:function scrub_email

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

Функции включаются в файл приложения db/structure.sql после запуска bin/rails db:migrate.

Камень fx уже добавлен в Rideshare, поэтому вы можете исследовать его там.

При первом запуске он создал файл SQL db/functions/scrub_email_v01.sql. Посетите каталог db/functions в Rideshare, чтобы увидеть изменения в этой функции.

Файл миграции в Rideshare выглядит следующим образом:

class CreateFunctionScrubEmail < ActiveRecord::Migration[7.0]
  def change
    create_function :scrub_email
  end 
end

Теперь, когда вы ознакомились с основами создания функции базы данных и управления ее жизненным циклом в приложении Rails, вы готовы вернуться к заполнению реализации функции.

Мы надеемся, что вам понравился этот отрывок из статьи Высокая производительность PostgreSQL для Rails Эндрю Аткинсона. Вы можете приобрести электронную книгу (теперь в бета-версии) непосредственно на The Pragmatic Bookshelf:



Поделитесь своим мнением на DevTalk: