Как развернуть приложения Elixir-Phoenix с MySQL в Ubuntu 16.04

_ Автор выбрал Code.org, чтобы получить пожертвование в размере 300 долларов США в рамках программы Write for DOnations. _

Вступление

В учебном пособии https://www.digitalocean.com/community/tutorials/how-to-automate-elixir-phoenix-deployment-with-distillery-and-edeliver-on-ubuntu-16-04: как автоматизировать эликсир Феникс Развертывание с помощью Distillery и edeliver], вы создали приложение Phoenix без базы данных и развернули его на рабочем сервере по адресу edeliver. Большинство реальных приложений требуют базы данных, которая требует некоторых изменений в процессе развертывания.

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

В этом руководстве вы настроите свое существующее приложение Phoenix для подключения к базе данных MySQL, используя Phoenix-Ecto и Mariaex , Ecto - широко используемая оболочка базы данных для приложений Phoenix. Mariaex - это драйвер базы данных, который интегрируется с Ecto и взаимодействует с базами данных MySQL и MariaDB.

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

Предпосылки

Для завершения этого урока вам понадобится:

Шаг 1 - Добавление Mariaex и Ecto в ваше приложение

Как правило, приложения Phoenix не устанавливают соединения с базами данных напрямую и не выполняют запросы SQL. Вместо этого database driver используется для подключения к требуемой базе данных, а database wrapper затем используется для запроса базы данных.

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

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

Поскольку вы указали флаг + - no-ecto + при создании приложения в https://www.digitalocean.com/community/tutorials/how-to-automate-elixir-phoenix-deployment-with-distillery-and -edeliver-on-ubuntu-16-04 [предыдущее руководство], в приложении не установлены ни Ecto, ни Mariaex. Теперь вы добавите Ecto и Mariaex в качестве зависимостей для вашего проекта.

Сначала переключитесь на каталог, содержащий ваш проект Phoenix.

cd ~/

Затем откройте файл + mix.exs +, который содержит список зависимостей для вашего приложения.

nano mix.exs

Найдите следующий блок кода:

~ / MyProject / mix.exs

 defp deps do
   [
     {:phoenix, "~> 1.3.0"},
     {:phoenix_pubsub, "~> 1.0"},
     {:phoenix_html, "~> 2.10"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:gettext, "~> 0.11"},
     {:cowboy, "~> 1.0"},
     {:edeliver, "~> 1.4.3"},
     {:distillery, "~> 1.4"}
   ]
 end

Добавьте Mariaex и Phoenix-Ecto как зависимости:

~ / MyProject / mix.exs

 defp deps do
   [
     {:phoenix, "~> 1.3.0"},
     {:phoenix_pubsub, "~> 1.0"},
     {:phoenix_html, "~> 2.10"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:gettext, "~> 0.11"},
     {:cowboy, "~> 1.0"},
     {:edeliver, "~> 1.4.3"},
     {:distillery, "~> 1.4"}


   ]
 end

Сохраните и закройте + mix.exs +. Затем выполните следующую команду, чтобы загрузить зависимости, которые вы только что добавили в проект.

mix deps.get

Вы увидите этот вывод, когда ваши зависимости установлены:

OutputRunning dependency resolution...
...
* Getting phoenix_ecto (Hex package)
 Checking package (https://repo.hex.pm/tarballs/phoenix_ecto-3.3.0.tar)
 Fetched package
* Getting mariaex (Hex package)
 Checking package (https://repo.hex.pm/tarballs/mariaex-0.8.3.tar)
 Fetched package
...

Вывод показывает, что Mix проверил совместимость между пакетами и получил пакеты вместе с их зависимостями из репозитория Hex. Если эта команда не выполнена, убедитесь, что у вас установлен Hex и вы правильно изменили + mix.exs +.

С Ecto и Mariaex на месте, вы можете настроить хранилище Ecto.

Шаг 2 - Настройка Ecto Repository в вашем приложении

Приложения Phoenix получают доступ к базе данных через оболочку базы данных Ecto. Оболочка базы данных реализована в виде модуля Elixir в вашем проекте. Вы можете импортировать этот модуль всякий раз, когда вам нужно взаимодействовать с базой данных и использовать функции, которые предоставляет модуль. Обернутая база данных называется repository.

Этот модуль репозитория должен включать макрос + Ecto.Repo + для предоставления доступа к функциям запроса, определенным Ecto. Кроме того, он должен содержать код для инициализации параметров, передаваемых адаптеру базы данных в функции с именем + init +.

Если вы не использовали флаг + - no-ecto + при создании проекта Phoenix, Phoenix автоматически сгенерирует этот модуль для вас. Но с тех пор, как вы это сделали, вам придется создать его самостоятельно.

Давайте создадим модуль в файле с именем + repo.ex + в каталоге + lib / +. Сначала создайте файл:

nano lib//repo.ex

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

~ / MyProject / Библиотека / MyProject / repo.ex

defmodule .Repo do
 use Ecto.Repo, otp_app: :

 @doc """
 Dynamically loads the repository url from the
 DATABASE_URL environment variable.
 """
 def init(_, opts) do
   {:ok, Keyword.put(opts, :url, System.get_env("DATABASE_URL"))}
 end
end

По умолчанию проекты Phoenix определяют функцию + init + так, что если существует переменная среды + DATABASE_URL +, то Ecto будет использовать конфигурацию в переменной среды для подключения к базе данных вместо использования учетных данных в файлах конфигурации Phoenix ( как мы сделаем в этом уроке позже).

Сохраните и закройте + repo.ex +.

Проекты Phoenix используют облегченные процессы Elixir для параллелизма и отказоустойчивости. Supervisors управляют этими процессами и перезапускают их в случае сбоя. Супервизоры могут также контролировать других супервизоров, и эта структура называется supervision tree.

Модуль + Myproject.Repo +, который вы только что добавили, реализует супервизор, который управляет процессами, подключающимися к базе данных. Чтобы запустить этого супервизора, вы должны добавить его в дерево надзора проекта.

Откройте файл + application.ex + в папке + lib / +.

nano lib//application.ex

Найдите следующий блок кода, который определяет дерево контроля:

~ / MyProject / Библиотека / MyProject / application.ex

...
   children = [
     # Start the endpoint when the application starts
     supervisor(.Endpoint, []),
     ...
   ]
...

Вы можете видеть, что конечная точка приложения + MyprojectWeb.Endpoint + запускается в качестве супервизора. Добавьте + Myproject.Repo + в этот список:

~ / MyProject / Библиотека / MyProject / myproject.ex

   children = [


     # Start the endpoint when the application starts
     supervisor(MyprojectWeb.Endpoint, []),
     ...
   ]

Если вы пропустите этот шаг, Ecto не будет создавать процессы для взаимодействия с базой данных, и любая попытка взаимодействия с базой данных приведет к сбою приложения.

Сохраните и закройте + application.ex +, прежде чем продолжить.

Наконец, укажите Ecto-репозиторий в конфигурации приложения, чтобы вы могли использовать задачи Mix, такие как + ecto.create + и + ecto.migrate +, для создания и управления вашей базой данных.

Откройте файл конфигурации в + config / config.exs +.

nano config/config.exs

Найдите следующую строку в конце файла:

~ / MyProject / конфигурации / config.exs

import_config "#{Mix.env}.exs"

Эта строка позволяет специфичным для среды файлам конфигурации, таким как + prod.exs + и + test.exs +, переопределять настройки в + config.exs + при необходимости. Добавьте следующий код * над * этой строкой для настройки хранилища Ecto:

~ / MyProject / конфигурации / config.exs

...

config :,
 ecto_repos: [.Repo]
...

Сохраните ваши изменения и закройте файл.

Теперь, когда вы настроили Ecto, перейдите к добавлению учетных данных вашей базы данных в приложение.

Шаг 3 - Настройка вашего приложения с учетными данными MySQL

Существуют три ситуации, в которых ваше приложение будет подключаться к базе данных: во время разработки, во время тестирования и в процессе производства.

Соответственно, Phoenix предоставляет три файла конфигурации для конкретной среды, которые содержат учетные данные, относящиеся к среде, в которой выполняется приложение. Эти файлы находятся в каталоге + config + в корне проекта. Вы измените эти три файла на этом шаге.

Во-первых, давайте настроим среду разработки. Откройте + dev.exs +.

nano config/dev.exs

Добавьте следующие строки, чтобы настроить адаптер базы данных на + Ecto.Adapters.MySQL, так как мы используем MySQL.

~ / MyProject / конфигурация / dev.exs

config :, .Repo,
 adapter:

Далее укажите желаемое имя базы данных в том же блоке кода.

~ / MyProject / конфигурация / dev.exs

config :myproject, Myproject.Repo,
 adapter: Ecto.Adapters.MySQL

Здесь мы определяем имя базы данных разработки как + _dev +. Это соглашение об именах, используемое приложениями Phoenix для баз данных. В соответствии с этим соглашением производственная база данных будет называться + _prod +, а тестовая база данных + _test +. Вместо этого вы можете использовать собственную схему именования.

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

~ / MyProject / конфигурация / dev.exs

config :myproject, Myproject.Repo,
 adapter: Ecto.Adapters.MySQL,
 database: "myproject_dev"

Наконец, установите размер пула на соответствующий номер. Размер пула - это максимальное количество подключений к базе данных, которое может иметь приложение. Эти соединения будут разделены между запросами. Оптимальный размер зависит от вашего оборудования, но вы можете использовать + 10 + для запуска.

~ / MyProject / конфигурация / dev.exs

config :myproject, Myproject.Repo,
 adapter: Ecto.Adapters.MySQL,
 username: "root",
 password: "password",
 database: "myproject_dev",
 hostname: "localhost"

Сохраните и закройте + dev.exs +.

Затем настройте тестовую среду. Откройте файл конфигурации тестовой среды + test.exs +.

nano config/test.exs

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

Однако вместо размера пула мы указываем + Ecto.Adapters.SQL.Sandbox + для значения пула. Это запустит тесты в режиме песочницы. То есть любые транзакции, выполненные с тестовой базой данных во время теста, будут откатываться. А это означает, что модульные тесты могут выполняться в произвольном порядке, поскольку база данных сбрасывается в исходное состояние после каждого теста.

И мы будем использовать + myproject_test + в качестве имени базы данных.

Добавьте следующую конфигурацию в файл + test.exs +:

~ / MyProject / конфигурации / test.exs

config :, .Repo,
 adapter: Ecto.Adapters.MySQL,
 username: "",
 password: "",
 database: "",
 hostname: "",
 pool: Ecto.Adapters.SQL.Sandbox

Сохраните и закройте + test.exs +.

Наконец, чтобы сконфигурировать учетные данные для вашего приложения в производственной среде, откройте секретный файл производственного процесса + prod.secret.exs +.

nano config/prod.secret.exs

Добавьте этот код в файл + prod.secret.exs +. Обратите внимание, что мы используем имя пользователя * myproject * здесь с паролем + пароль +. , Мы вскоре создадим этого пользователя на сервере производственной базы данных, используя пароль, указанный здесь. Вы хотите использовать более безопасный пароль здесь.

~ / MyProject / конфигурация / prod.secret.exs

config :, .Repo,
 adapter: Ecto.Adapters.MySQL,
 username: "",
 password: "",
 database: "",
 hostname: "",
 pool_size: 10

Сохраните ваши изменения и закройте файл.

Этот файл не отслеживается Git по соображениям безопасности, поэтому вы должны вручную передать его на сервер. Для получения дополнительной информации об этом процессе обратитесь к шагу 3 предварительного условия https://www.digitalocean.com/community/tutorials/how-to-automate-elixir-phoenix-deployment-with-distillery-and-edeliver-on-ubuntu -16-04 [учебник по развертыванию приложений Phoenix].

scp ~/myproject/config/prod.secret.exs @:/home//app_config/prod.secret.exs

Затем вызовите задачу + ecto.create + Mix, чтобы создать базу данных разработки. Обратите внимание, что вам не нужно создавать тестовую базу данных, поскольку Phoenix сделает это за вас при запуске тестов.

mix ecto.create

Вы увидите следующий вывод, показывающий, что Ecto успешно создала базу данных:

Output...
The database for .Repo has been created

Если вы не видите этот вывод, убедитесь, что ваши данные конфигурации верны и что MySQL работает. Ecto также откажется создавать базу данных, если ваше приложение не скомпилируется из-за каких-либо ошибок.

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

Шаг 4 - Настройка производственной базы данных

С задачей + ecto.create + Mix вы создали пустую базу данных на своем компьютере разработчика. Теперь вы сделаете то же самое для своего производственного сервера. К сожалению, нет никаких задач Mix или команд edeliver, которые бы помогли нам достичь этого, поэтому вы должны вручную войти на сервер и создать пустую базу данных с командами SQL с помощью консоли MySQL.

Подключитесь к серверу через SSH.

ssh @

Теперь получите доступ к консоли MySQL, используя пользователя * root * и пароль, который вы настроили.

mysql -u  -p

После входа в систему создайте производственную базу данных:

CREATE DATABASE ;

Вы увидите следующий вывод, сообщающий, что база данных была создана:

OutputQuery OK, 1 row affected (0.00 sec)

Затем создайте пользователя для приложения, используя имя пользователя * myproject * и пароль, который вы указали на предыдущем шаге:

CREATE USER ''@'localhost' IDENTIFIED BY '';

Затем предоставьте пользователю * myproject * доступ к базе данных, которую вы создали:

GRANT ALL PRIVILEGES ON .* to ''@'localhost';

Наконец, примените изменения разрешения:

FLUSH PRIVILEGES;

Выйдите из консоли MySQL, набрав + exit +. Завершите соединение SSH, снова набрав + exit +.

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

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

Шаг 5 - Развертывание проекта на сервере

На этом шаге вы собираетесь заменить работающее приложение, не имеющее связи с базой данных, на ваше вновь сконфигурированное приложение и его новый репозиторий Ecto. Этот шаг позволит вам убедиться, что приложение настроено правильно и все еще работает как положено.

Откройте + mix.exs + и увеличьте версию приложения. Номер версии упрощает отслеживание выпусков и откат к предыдущим версиям, если это необходимо. Он также используется edeliver для обновления вашего приложения без простоев.

nano mix.exs

Увеличьте поле версии до подходящего значения.

~ / MyProject / mix.exs

 def project do
   [
     app: :myproject,
     version: "",
     elixir: "~> 1.4",
     elixirc_paths: elixirc_paths(Mix.env),
     compilers: [:phoenix, :gettext] ++ Mix.compilers,
     start_permanent: Mix.env == :prod,
     deps: deps()
   ]
 end

Чтобы использовать edeliver для выполнения миграции базы данных, edeliver должен быть последним приложением, которое запускается в вашем проекте. Найдите следующий блок кода:

~ / MyProject / mix.exs

 def application do
   [
     mod: {.Application, []},
     extra_applications: [:logger, :runtime_tools]
   ]
 end

Добавьте + edeliver + в конец списка + extra_applications +:

~ / MyProject / mix.exs

 def application do
   [
     mod: {.Application, []},
     extra_applications: [:logger, :runtime_tools]
   ]
 end

Сохраните и закройте + mix.exs +.

Запустите приложение, чтобы убедиться, что все работает и нет ошибок компиляции:

mix phx.server

Посетите http: // localhost: 4000 [http: // localhost: 4000 / address], чтобы убедиться, что приложение все еще работает. Если он не запускается или вы видите ошибки компиляции, просмотрите шаги в этом руководстве и устраните их, прежде чем двигаться дальше.

Если все работает как положено, дважды нажмите + CTRL + C + на терминале, чтобы остановить сервер.

Затем внесите изменения с помощью Git. Вы должны делать это каждый раз, когда вносите изменения в свой проект, потому что edeliver использует Git для отправки кода с последнего коммита на сервер сборки для дальнейших действий.

git add .
git commit -m "Configured application with database"

Наконец, используйте edeliver для обновления приложения на рабочем сервере. Следующая команда создаст и развернет последнюю версию вашего проекта перед обновлением приложения, работающего на рабочем компьютере, без простоев.

mix edeliver upgrade production

Вы увидите следующий вывод:

OutputEDELIVER MYPROJECT WITH UPGRADE COMMAND

-----> Upgrading to revision 2512398 from branch master
-----> Detecting release versions on production hosts
-----> Deploying upgrades to 1 online hosts
-----> Checking whether installed version 0.0.2 is in release store
-----> Building the upgrade from version 0.0.2
-----> Authorizing hosts
-----> Validating * version 0.0.2 is in local release store
-----> Ensuring hosts are ready to accept git pushes
-----> Pushing new commits with git to: @
-----> Resetting remote hosts to 2512398838c2dcc43de3ccd869779dded4fd5b6b
-----> Cleaning generated files from last build
-----> Checking out 2512398838c2dcc43de3ccd869779dded4fd5b6b
-----> Fetching / Updating dependencies
-----> Compiling sources
-----> Checking version of new release
-----> Uploading archive of release 0.0.2 from local release store
-----> Extracting archive myproject_0.0.2.tar.gz
-----> Removing old releases which were included in upgrade package
-----> Generating release
-----> Removing built release 0.0.2 from remote release directory
-----> Copying release 0.0.3 to local release store
-----> Copying myproject.tar.gz to release store
-----> Upgrading production hosts to version 0.0.3
-----> Authorizing hosts
-----> Uploading archive of release 0.0.3 from local release store
-----> Upgrading release to 0.0.3

UPGRADE DONE!

Хотя обновление успешно завершено, вы не сможете запускать задачи edeliver, связанные с базой данных, пока не перезапустите приложение.

mix edeliver restart production

Вы увидите этот вывод:

OutputEDELIVER  WITH RESTART COMMAND

-----> restarting production servers

production node:

 user    :
 host    :
 path    : /home//app_release
 response: ok

RESTART DONE!

edeliver сообщает нам, что успешно перезапустил производственный сервер.

Чтобы убедиться, что ваше приложение было обновлено, выполните следующую команду edeliver, чтобы получить версию приложения, которая в данный момент работает в рабочей среде.

mix edeliver version production
OutputEDELIVER MYPROJECT WITH VERSION COMMAND

-----> getting release versions from production servers

production node:

 user    :
 host    :
 path    : /home//app_release
 response:

VERSION DONE!

Вывод говорит нам, что на производственном сервере запущена версия приложения ++.

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

Если обновление прошло успешно, но не удалось обновить приложение, убедитесь, что вы зафиксировали свой код и повысили версию приложения. Если команда обновления завершится неудачно, edeliver выведет код bash, который он выполнял на сервере при возникновении ошибки, и само сообщение об ошибке. Вы можете использовать эти подсказки, чтобы решить вашу проблему.

Теперь, когда вы добавили поддержку базы данных в свое приложение и развернули его в рабочей среде, вы теперь готовы добавить некоторые функции, использующие MySQL.

Шаг 6 - Создание адресной книги

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

Вместо того, чтобы писать код для адресной книги с нуля, мы будем использовать Phoenix Generators для создания адресной книги. Генераторы Phoenix - это утилиты, которые генерируют код для простой функции CRUD (создание, чтение, обновление, удаление). Это обеспечивает хорошую отправную точку для многих функций приложения, которые вы, возможно, захотите создать.

Адресной книге также потребуется таблица в базе данных для хранения записей. Чтобы добавить эту таблицу в базу данных, вы можете создать и выполнить SQL-запрос, но вместо этого мы будем использовать функцию миграции Ecto для изменения базы данных. Этот подход имеет несколько преимуществ. Во-первых, это не зависит от базы данных; Команды одинаковы, используете ли вы PostgreSQL, MySQL или какую-либо другую базу данных. Далее, файлы миграции предоставляют удобный способ отслеживать, как со временем меняется схема вашей базы данных. Наконец, вы также можете откатить последние миграции на машине для разработки, если вам нужно.

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

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

  • Context * - это модуль, который будет содержать функции для связанных ресурсов. Например, если вы планируете вести список пользователей, которые зарегистрировались на вашем сайте, и журнал сеансов, когда пользователи входят в систему, имеет смысл поместить пользователей и сеансы в один контекстный модуль с именем «Учетная запись».

Обратите внимание, что по соглашению Phoenix предполагает, что множественное имя объекта является именем таблицы базы данных для этого ресурса.

Давайте создадим адресную книгу с генератором. Для простоты адресной книги мы включим только три поля для каждой записи - имя, адрес электронной почты и почтовый индекс. Мы будем называть каждую запись как + Address +, несколько записей как + address + и контекст, в котором адресная книга должна находиться как + AddressBook +.

Запустите эту команду для создания адресной книги:

mix phx.gen.html
Output* creating lib/myproject_web/controllers/.ex
...
* creating priv/repo/migrations/_create_address.exs

Add the resource to your browser scope in web/router.ex:

   resources "/",

Remember to update your repository by running migrations:

   $ mix ecto.migrate

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

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

Чтобы избежать простоев и ошибок, разверните изменения в два этапа:

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

  2. Внесите изменения в код приложения, затем создайте и разверните другой выпуск.

Если мы не воспользуемся этим подходом, код адресной книги попытается сослаться на таблицу адресов, которую нам еще предстоит создать, и наше приложение будет аварийно завершено.

Прежде чем мы перенесем производственную базу данных, давайте посмотрим на файл миграции. Он находится по адресу + priv / repo / migrations / _create_addresses.exs +, хотя имя файла будет иметь другую дату, основанную на том, когда вы ее создали. Откройте файл в вашем редакторе:

nano priv/repo/migrations/*_create_addresses.exs

Файл миграции, сгенерированный Phoenix, представляет собой модуль Elixir с единственной функцией, называемой + change +. Когда вы выполните миграцию позже, эта функция будет вызвана.

~ / MyProject / собств / репо / Миграции / 20180501040548_create_addresses.exs

defmodule Myproject.Repo.Migrations.CreateAddresses do
 use Ecto.Migration

 def change do
   create table(:addresses) do
     add :name, :string
     add :email, :string
     add :zip_code, :integer

     timestamps()
   end

 end
end

В этой функции генератор Phoenix написал код для создания таблицы + address + вместе с полями, которые вы указали. Кроме того, генератор также включил функцию + timestamps () +, которая добавляет для вас еще два поля: + insert_at + и + updated_at +. Значения, хранящиеся в этих полях, обновляются автоматически при вставке или обновлении данных.

Закройте файл без каких-либо изменений; сгенерированный код - это все, что вам нужно.

Чтобы развернуть только файл миграции без включения кода приложения, мы будем использовать тот факт, что edeliver использует Git для переноса нашего проекта на сервер сборки. В частности, мы просто подготовим и передадим файл миграции, оставив оставшиеся сгенерированные файлы без изменений.

Но прежде чем вы сможете это сделать, увеличьте версию приложения в + mix.exs +. Edeliver использует номер версии для подготовки к горячим обновлениям, поэтому вам нужно увеличивать номер версии для каждого обновления.

Откройте + mix.exs +.

nano mix.exs

Увеличьте версию своего приложения до подходящего значения.

~ / MyProject / mix.exs

 def project do
   [
     app: :myproject,
     version: "",
     ...

Сохраните и закройте файл.

Теперь используйте Git для создания файла + mix.exs + и файла миграции.

git add mix.exs priv/repo/migrations/*_create_addresses.exs

Далее зафиксируйте поставленные файлы.

git commit -m "Adding addresses table to the database"

С этим обновите свое производственное приложение с edeliver.

mix edeliver upgrade production

После завершения обновления выполните следующую команду edeliver, чтобы перенести производственную базу данных.

mix edeliver migrate production

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

OutputEDELIVER  WITH MIGRATE COMMAND

-----> migrateing production servers

production node:

 user    :
 host    :
 path    : /home//app_release
 response: []

MIGRATE DONE!

Производственная база данных теперь имеет пустую таблицу с именем + address +.

Поле + response + будет показывать + [] +, если не выполнялись миграции. Если это так, убедитесь, что вы зафиксировали свой код с помощью Git, прежде чем обновлять снова. Если проблема не устраняется, перезапустите производственное приложение, набрав + mix edeliver restart production +, и снова запустите задачу миграции базы данных.

Имея таблицу + address +, мы можем продолжить следовать инструкциям, выданным Phoenix при создании адресной книги и создании нового выпуска.

Сначала откройте файл + lib / myproject_web / router.ex +:

nano lib/myproject_web/router.ex

Найдите следующий блок кода:

~ / MyProject / Библиотека / myproject_web / router.ex

 scope "/",  do
   pipe_through :browser

   get "/", PageController, :index
 end

Вставьте маршрут для ресурса + address +:

~ / MyProject / Библиотека / myproject_web / router.ex

 scope "/",  do
   pipe_through :browser

   get "/", PageController, :index

 end

Сохраните и закройте + router.ex +.

Затем попросите Ecto внести изменения в локальную базу данных.

mix ecto.migrate

Вывод показывает, что была вызвана функция в файле миграции, которая успешно создала таблицу + address +.

Output...
[info] == Running .Repo.Migrations.CreateAddresses.change/0 forward
[info] create table addresses
[info] == Migrated in 0.0s

Теперь запустите локальный сервер разработки, чтобы протестировать новую функцию:

mix phx.server

Направьте ваш браузер на http: // localhost: 4000 / address, чтобы увидеть новую функцию в действии.

Когда вы убедитесь, что все работает локально, вернитесь к своему терминалу и дважды нажмите + CTRL + C +, чтобы завершить работу сервера.

Теперь, когда все работает, вы можете внедрить изменения в производство. Откройте + mix.exs +, чтобы обновить версию приложения.

nano mix.exs

Увеличьте поле версии до подходящего значения.

~ / MyProject / mix.exs

 def project do
   [
     app: :myproject,
     version: "",
     elixir: "~> 1.4",
     elixirc_paths: elixirc_paths(Mix.env),
     compilers: [:phoenix, :gettext] ++ Mix.compilers,
     start_permanent: Mix.env == :prod,
     deps: deps()
   ]
 end

Сохраните и закройте + mix.exs +.

Зафиксируйте свои изменения с помощью Git. На этот раз подготовьте все файлы.

git add .
git commit -m "Added application code for address book"

Обновите производственное приложение с помощью edeliver.

mix edeliver upgrade production

После завершения обновления вы можете получить доступ к новой функции по адресу + https: /// address +.

Благодаря этому вы успешно обновили производственное приложение и базу данных.

Заключение

В этой статье вы настроили свое приложение Phoenix для использования базы данных MySQL и использовали миграции edeliver и Ecto для внесения изменений в производственную базу данных. При использовании этого метода вам не нужно прикасаться к производственной базе данных, и любые изменения, которые вы хотите внести в производственную базу данных, выполняются с помощью файлов миграции Ecto. Это облегчает откат изменений и отслеживание изменений в базе данных с течением времени.

Чтобы узнать больше о миграциях Ecto и о том, как выполнять сложные манипуляции с базой данных, обратитесь к official документу Ecto миграций.

Related