_ Автор выбрал 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 для развертывания изменений на вашем производственном сервере. Пользователи вашего сайта смогут создавать, читать, обновлять и удалять записи в этой адресной книге.
Предпосылки
Для завершения этого урока вам понадобится:
-
Готовое приложение Phoenix из учебника https://www.digitalocean.com/community/tutorials/how-to-automate-elixir-phoenix-deployment-with-distillery-and-edeliver-on-ubuntu-16-04[How автоматизировать развертывание эликсира феникса с помощью ликеро-водочного завода и эделивера. Это приложение должно работать за Nginx с использованием сертификата Let’s Encrypt и быть развернуто с помощью edeliver.
-
MySQL установлен на вашем сервере, следуя How для установки MySQL на Ubuntu 16.04.
-
MySQL установлен на вашем локальном компьютере для тестирования базы данных перед развертыванием.
Шаг 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 сообщает нам, что он автоматически сгенерировал файлы шаблонов, тестовые файлы, модель, контроллер и файл миграции. Он также дает нам указание добавить ресурс в файл маршрутизатора и обновить хранилище.
Вы можете следовать инструкциям, которые вы видите в выходных данных, но тем самым вы объедините обновление кода приложения и миграцию базы данных в одном выпуске. Это может привести к сбою в работе некоторых частей приложения с момента развертывания приложения на производственном сервере до момента миграции производственной базы данных. В течение этого интервала код приложения может ссылаться на несуществующие таблицы или столбцы в базе данных.
Чтобы избежать простоев и ошибок, разверните изменения в два этапа:
-
Добавьте файл миграции базы данных с необходимыми изменениями в базу данных без внесения изменений в код приложения. Создайте выпуск, обновите производственный сервер и перенесите производственную базу данных.
-
Внесите изменения в код приложения, затем создайте и разверните другой выпуск.
Если мы не воспользуемся этим подходом, код адресной книги попытается сослаться на таблицу адресов, которую нам еще предстоит создать, и наше приложение будет аварийно завершено.
Прежде чем мы перенесем производственную базу данных, давайте посмотрим на файл миграции. Он находится по адресу + 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 миграций.