如何在Ubuntu16.04上使用MySQL部署Elixir-Phoenix应用程序

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Code.org 来获得 300 美元的捐款。

介绍

在教程 如何使用 Distillery 和 edeliver 自动化 Elixir Phoenix 部署中,您创建了一个没有数据库的 Phoenix 应用程序,并使用 edeliver 将其部署到生产服务器。 大多数现实世界的应用程序都需要一个数据库,这需要对部署过程进行一些修改。

您可以使用 edeliver 将应用程序和数据库更改同时推送到生产服务器,以便在部署期间管理数据库更改。

在本指南中,您将配置现有的 Phoenix 应用程序以使用 Phoenix-EctoMariaex 连接到 MySQL 数据库。 Ecto 是 Phoenix 应用程序中广泛使用的数据库包装器。 Mariaex 是一个与 Ecto 集成并与 MySQL 和 MariaDB 数据库对话的数据库驱动程序。

您还将在开发机器上创建一个简单的地址簿,该地址簿利用数据库并使用 edeliver 将更改部署到生产服务器。 您站点的用户将能够创建、阅读、更新和删除此地址簿中的条目。

先决条件

要完成本教程,您需要:

第 1 步 — 将 Mariaex 和 Ecto 添加到您的应用程序中

通常,Phoenix 应用程序不直接与数据库建立连接并执行 SQL 查询。 相反,使用 数据库驱动程序 连接到所需的数据库,然后使用 数据库包装器 查询数据库。

数据库驱动程序是一个 Elixir 应用程序,它负责使用数据库的日常任务,例如建立连接、关闭连接和执行查询。 数据库包装器是数据库驱动程序之上的一层,它允许 Elixir 程序员使用 Elixir 代码创建数据库查询,并提供查询组合(查询链接)等附加功能。

这种分离使模块化应用程序成为可能。 无论使用何种数据库,数据库包装器以及与数据库交互的应用程序代码都基本相同。 只需更改数据库驱动程序,Phoenix 应用程序就可以使用不同的数据库软件。

由于您在 上一教程 中创建应用程序时提供了 --no-ecto 标志,因此该应用程序既没有安装 Ecto 也没有安装 Mariaex。 您现在将添加 Ecto 和 Mariaex 作为项目的依赖项。

注意: Phoenix 应用默认使用 PostgreSQL。 要使用 MySQL 数据库生成新应用程序,请使用命令 mix phx.new --database mysql myproject


首先,切换到包含您的 Phoenix 项目的目录。

cd ~/myproject

然后打开 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"},
      {:phoenix_ecto, "~> 3.2"},
      {:mariaex, "~> 0.8.2"}
    ]
  end

警告: 为避免潜在的配置问题,请仔细检查您是否在新的 phoenix_ecto 条目之前的行尾添加了逗号 (,)。


保存并关闭 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 存储库

Phoenix 应用程序通过称为 Ecto 的数据库包装器访问数据库。 数据库包装器在项目中以 Elixir 模块的形式实现。 您可以在需要与数据库交互并使用模块提供的功能时导入此模块。 打包的数据库称为 存储库

此存储库模块必须包含 Ecto.Repo 宏以提供对 Ecto 定义的查询函数的访问权限。 此外,它必须包含代码,以初始化在名为 init 的函数中传递给数据库适配器的选项。

如果您在创建 Phoenix 项目时没有使用 --no-ecto 标志,Phoenix 会自动为您生成此模块。 但是既然你这样做了,你就必须自己创建它。

让我们在 lib/myproject 目录下名为 repo.ex 的文件中创建模块。 首先创建文件:

nano lib/myproject/repo.ex

将以下代码添加到文件中以定义存储库:

~/myproject/lib/myproject/repo.ex

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

  @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 管理这些进程并在它们崩溃时重新启动它们。 监督者也可以监督其他监督者,这种结构称为监督树

您刚刚添加的 Myproject.Repo 模块实现了一个管理程序,用于管理连接到数据库的进程。 要启动此主管,您必须将其添加到项目的监督树中。

打开 lib/myproject 文件夹中的 application.ex 文件。

nano lib/myproject/application.ex

找到以下定义监督树的代码块:

~/myproject/lib/myproject/application.ex

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

您可以看到应用程序端点 MyprojectWeb.Endpoint 正在作为主管启动。 将 Myproject.Repo 添加到此列表:

~/myproject/lib/myproject/myproject.ex

    children = [
      # Start the Ecto repository
      supervisor(Myproject.Repo, []),
      # Start the endpoint when the application starts
      supervisor(MyprojectWeb.Endpoint, []),
      ...
    ]

如果您跳过此步骤,Ecto 将不会创建与数据库交互的进程,并且任何与数据库交互的尝试都将导致应用程序崩溃。

在继续之前保存并关闭 application.ex

最后,在应用程序配置中指定 Ecto 存储库,以便您可以使用诸如 ecto.createecto.migrate 之类的混合任务来创建和管理您的数据库。

config/config.exs 打开配置文件。

nano config/config.exs

在文件末尾找到以下行:

~/myproject/config/config.exs

import_config "#{Mix.env}.exs"

此行允许环境特定的配置文件,例如 prod.exstest.exs,在必要时覆盖 config.exs 中的设置。 在该行的 上方添加以下代码 以配置 Ecto 存储库:

~/myproject/config/config.exs

...

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

保存更改并关闭文件。

现在您已配置 Ecto,继续将您的数据库凭据添加到应用程序。

第 3 步 — 使用 MySQL 凭证配置您的应用程序

在三种情况下,您的应用程序会连接到数据库:开发期间、测试期间和生产期间。

相应地,Phoenix 提供了三个特定于环境的配置文件,其中包含与应用程序运行环境相关的凭据。 这些文件位于项目根目录的 config 目录中。 您将在此步骤中修改这三个文件。

首先,让我们配置开发环境。 打开 dev.exs

nano config/dev.exs

添加以下行将数据库适配器配置为 Ecto.Adapters.MySQL,因为我们使用的是 MySQL。

~/myproject/config/dev.exs

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

接下来,在同一代码块中指定所需的数据库名称。

~/myproject/config/dev.exs

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

在这里,我们定义开发数据库名称为myproject_dev。 这是 Phoenix 应用程序用于数据库的命名约定。 按照这个约定,生产数据库将被称为 myproject_prod 和测试数据库 myproject_test。 您可以改用自己的命名方案。

现在,为您的开发数据库服务器提供主机名、用户名和密码。

~/myproject/config/dev.exs

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

最后,将池大小设置为适当的数字。 池大小是应用程序可以拥有的与数据库的最大连接数。 这些连接将在请求之间共享。 最佳大小取决于您的硬件,但您可以使用 10 启动。

~/myproject/config/dev.exs

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

保存并关闭 dev.exs

接下来,配置您的测试环境。 打开测试环境配置文件【X45X】【X49X】。

nano config/test.exs

在本教程中,我们将在本地数据库服务器上托管测试数据库以及开发数据库。 因此,测试数据库的配置几乎相同。

但是,我们指定 Ecto.Adapters.SQL.Sandbox 作为池值,而不是池大小。 这将以沙盒模式运行测试。 也就是说,在测试期间使用测试数据库进行的任何事务都将被回滚。 这意味着单元测试可以以随机顺序运行,因为每次测试后数据库都会重置为初始状态。

我们将使用 myproject_test 作为数据库名称。

将以下配置添加到 test.exs 文件中:

~/myproject/config/test.exs

config :myproject, Myproject.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: "root",
  password: "password",
  database: "myproject_test",
  hostname: "localhost",
  pool: Ecto.Adapters.SQL.Sandbox

保存并关闭 test.exs

最后,要为生产中的应用程序配置凭据,请打开生产机密文件 prod.secret.exs

nano config/prod.secret.exs

将此代码添加到 prod.secret.exs 文件中。 请注意,我们在这里使用用户名 myproject 和密码 password。 . 我们很快将使用此处指定的密码在生产数据库服务器上创建此用户。 您需要在此处使用更安全的密码。

~/myproject/config/prod.secret.exs

config :myproject, Myproject.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: "myapp",
  password: "password",
  database: "myproject_prod",
  hostname: "localhost",
  pool_size: 10

保存更改并关闭文件。

出于安全原因,Git 不会跟踪此文件,因此您必须手动将其传输到服务器。 有关此过程的更多信息,请参阅部署 Phoenix 应用程序 的先决条件 教程的第 3 步。

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

然后调用 ecto.create Mix 任务创建开发数据库。 请注意,您不必创建测试数据库,因为 Phoenix 会在您运行测试时为您创建。

mix ecto.create

您将看到以下输出表明 Ecto 已成功创建数据库:

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

如果您没有看到此输出,请确保您的配置详细信息正确且 MySQL 正在运行。 如果您的应用程序由于任何错误而无法编译,Ecto 也会拒绝创建数据库。

现在您已经设置项目连接到数据库,甚至在开发机器中使用 Ecto 创建了数据库,您可以继续修改服务器上的数据库。

第 4 步 — 设置生产数据库

通过 ecto.create Mix 任务,您在开发机器上创建了一个空数据库。 现在,您将对生产服务器执行相同的操作。 不幸的是,没有任何 Mix 任务或 edeliver 命令来帮助我们实现这一点,因此您将手动登录到服务器并使用 MySQL 控制台使用 SQL 命令创建一个空数据库。

通过 SSH 连接到服务器。

ssh sammy@your_server_ip

现在使用 root 用户和您配置的密码访问 MySQL 控制台。

mysql -u root -p

登录后,创建生产数据库:

CREATE DATABASE myproject_prod;

您将看到以下输出,让您知道数据库已创建:

OutputQuery OK, 1 row affected (0.00 sec)

接下来,使用用户名 myproject 和您在上一步中指定的密码为应用程序创建一个用户:

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

然后让 myproject 用户访问您创建的数据库:

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

最后,应用权限更改:

FLUSH PRIVILEGES;

通过键入 exit 退出 MySQL 控制台。 通过再次键入 exit 来终止 SSH 连接。

从现在开始,您将很少需要接触生产数据库,因为您将执行几乎所有操作,例如从本地计算机创建和更改表。

生产数据库现已准备就绪,您可以将应用程序重新部署到服务器。

第 5 步 — 将项目部署到服务器

在此步骤中,您将使用新配置的应用程序及其新的 Ecto 存储库替换与数据库没有连接的正在运行的应用程序。 此步骤将允许您确保应用程序配置正确并且仍按预期运行。

打开 mix.exs 并增加应用程序版本。 版本号可以更轻松地跟踪版本并在必要时回滚到以前的版本。 edeliver 也使用它来升级您的应用程序而无需停机。

nano mix.exs

将版本字段增加到适当的值。

~/myproject/mix.exs

  def project do
    [
      app: :myproject,
      version: "0.0.3",
      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: {Myproject.Application, []},
      extra_applications: [:logger, :runtime_tools]
    ]
  end

edeliver 添加到 extra_applications 列表的末尾:

~/myproject/mix.exs

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

保存并关闭 mix.exs

启动应用程序以确保一切正常并且没有编译错误:

mix phx.server

访问 http://localhost:4000/addresses 以确保应用程序仍然有效。 如果它没有启动,或者您看到编译错误,请查看本教程中的步骤并在继续之前解决它们。

如果一切正常,请在终端中按 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: sammy@example.com
-----> 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!

尽管升级已成功完成,但在重新启动应用程序之前,您将无法运行与数据库相关的交付任务。

警告: 以下命令将导致您的应用程序在短时间内离线。


mix edeliver restart production

你会看到这个输出:

OutputEDELIVER MYPROJECT WITH RESTART COMMAND

-----> restarting production servers

production node:

  user    : sammy
  host    : example.com
  path    : /home/sammy/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    : sammy
  host    : example.com
  path    : /home/sammy/app_release
  response: 0.0.3

VERSION DONE!

输出告诉我们生产服务器正在运行应用程序版本 0.0.3

您还可以在 https://example.com 访问您的应用程序,以确保它正在运行。 应用程序不应该有任何可观察到的变化,因为我们没有接触应用程序代码本身。

如果升级成功但无法更新应用程序,请确保您已提交代码并提升了应用程序版本。 如果升级命令失败,edeliver 将输出错误发生时它在服务器上执行的 bash 代码以及错误消息本身。 您可以使用这些线索来解决您的问题。

现在您已经为您的应用程序添加了数据库支持并将其部署到生产环境中,您现在可以添加一些使用 MySQL 的功能。

第 6 步 — 创建地址簿

为了演示如何部署数据库更改,让我们在我们的应用程序中构建一个简单的地址簿并将其部署到生产环境中。

警告:此地址簿将可公开访问,任何人都可以访问和编辑它。 完成本教程后取消该功能,或添加一个身份验证系统,如 Guardian 以限制访问。


我们将使用 Phoenix generators 来创建地址簿,而不是从头开始编写地址簿的代码。 Phoenix 生成器是为简单的 CRUD(创建、读取、更新、删除)功能生成代码的实用程序。 这为您可能想要构建的许多应用程序功能提供了一个很好的起点。

地址簿还需要数据库中的一个表来存储条目。 要将此表添加到数据库,您可以构造并执行 SQL 查询,但我们将使用 Ecto 的迁移功能来修改数据库。 这种方法有几个优点。 首先,它是独立于数据库的; 无论您使用的是 PostgreSQL、MySQL 还是其他数据库,这些命令都是相同的。 接下来,迁移文件提供了一种方便的方法来跟踪您的数据库模式如何随时间变化。 最后,如果需要,您还可以在开发机器上回滚最新的迁移。

值得庆幸的是,除非另有说明,否则您不必从头开始编写迁移文件,因为 Phoenix 生成器会为您制作一个。

要使用生成器,请指定上下文、实体的单数名称、实体的复数名称以及所有其他字段及其各自的类型。

context 是一个包含相关资源函数的模块。 例如,如果您计划维护在您的站点上注册的用户列表和用户登录时的会话日志,则将用户和会话放在名为“帐户”的单个上下文模块下是有意义的。

请注意,按照惯例,Phoenix 假定实体的复数名称是该资源的数据库表的名称。

让我们用生成器创建地址簿。 为了使地址簿简单,我们将只为每条记录包括三个字段——姓名、电子邮件和邮政编码。 我们将每个条目称为 Address,将多个条目称为 addresses,将地址簿所在的上下文称为 AddressBook

运行以下命令生成通讯录:

mix phx.gen.html AddressBook Address addresses name:string email:string zip_code:integer
Output* creating lib/myproject_web/controllers/address_controller.ex
...
* creating priv/repo/migrations/20180318032834_create_address.exs

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

    resources "/addresses", AddressController

Remember to update your repository by running migrations:

    $ mix ecto.migrate

Phoenix 告诉我们它自动生成了模板文件、测试文件、模型、控制器和迁移文件。 它还指示我们将资源添加到路由器文件并更新存储库。

您可以按照在输出中看到的说明进行操作,但这样做,您将在一个版本中捆绑应用程序代码升级和数据库迁移。 从应用程序部署到生产服务器到迁移生产数据库期间,这可能会导致应用程序的某些部分在生产中失败。 在此间隔期间,应用程序代码可能正在引用数据库中不存在的表或列。

为防止停机和错误,请分两步部署更改:

  1. 在不更改应用程序代码的情况下,添加对数据库进行必要更改的数据库迁移文件。 创建发布,升级生产服务器并迁移生产数据库。
  2. 更改应用程序代码,然后创建和部署另一个版本。

如果我们不采用这种方法,地址簿的代码将尝试引用我们尚未创建的地址表,我们的应用程序将崩溃。

在我们迁移生产数据库之前,让我们看一下迁移文件。 它位于 priv/repo/migrations/20180501040548_create_addresses.exs,尽管文件名会根据您创建它的时间而具有不同的日期戳。 在编辑器中打开文件:

nano priv/repo/migrations/*_create_addresses.exs

Phoenix 生成的迁移文件是一个 Elixir 模块,具有一个名为 change 的函数。 当您稍后执行迁移时,将调用此函数。

~/myproject/priv/repo/migrations/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 生成器编写了代码来创建 addresses 表以及您提供的字段。 此外,生成器还包含 timestamps() 功能,它为您添加了另外两个字段:inserted_atupdated_at。 当您插入或更新数据时,这些字段中存储的值会自动更新。

关闭文件而不做任何更改; 生成的代码就是您所需要的。

为了只部署迁移文件而不包括应用程序代码,我们将利用 edeliver 使用 Git 将我们的项目传输到构建服务器这一事实。 具体来说,我们将只暂存并提交迁移文件,同时不跟踪其余生成的文件。

但在您这样做之前,请在 mix.exs 中增加应用程序版本。 Edeliver 使用版本号来准备热升级,因此您需要为每次更新增加版本号。

打开 mix.exs

nano mix.exs

将您的应用程序版本增加到适当的值。

~/myproject/mix.exs

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

保存并关闭文件。

现在,使用 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 MYPROJECT WITH MIGRATE COMMAND

-----> migrateing production servers

production node:

  user    : sammy
  host    : example.com
  path    : /home/sammy/app_release
  response: [20180501040548]

MIGRATE DONE!

生产数据库现在有一个名为 addresses 的空表。

如果没有运行迁移,response 字段将显示 []。 如果是这种情况,请确保在再次升级之前使用 Git 提交了代码。 如果问题仍然存在,请键入 mix edeliver restart production 重新启动生产应用程序,然后再次运行数据库迁移任务。

有了 addresses 表,我们就可以按照 Phoenix 在生成地址簿时发布的说明进行操作并创建新版本。

首先,打开文件lib/myproject_web/router.ex文件:

nano lib/myproject_web/router.ex

找到以下代码块:

~/myproject/lib/myproject_web/router.ex

  scope "/", MyprojectWeb do
    pipe_through :browser 

    get "/", PageController, :index
  end

插入 addresses 资源的路由:

~/myproject/lib/myproject_web/router.ex

  scope "/", MyprojectWeb do
    pipe_through :browser 

    get "/", PageController, :index
    resources "/addresses", AddressController
  end

保存并关闭 router.ex

接下来,要求 Ecto 对本地数据库进行更改。

mix ecto.migrate

输出显示迁移文件中的函数被调用,成功创建表addresses

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

现在启动本地开发服务器以测试您的新功能:

mix phx.server

将浏览器指向 http://localhost:4000/addresses 以查看正在运行的新功能。

当您对本地工作感到满意时,返回您的终端并按 CTRL+C 两次以终止服务器。

现在一切正常,您可以将更改部署到生产环境。 打开 mix.exs 更新应用程序版本。

nano mix.exs

将版本字段增加到适当的值。

~/myproject/mix.exs

  def project do
    [
      app: :myproject,
      version: "0.0.5",
      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://example.com/addresses 访问新功能。

这样,您就成功升级了生产应用程序和数据库。

结论

在本文中,您将 Phoenix 应用程序配置为使用 MySQL 数据库,并使用 edeliver 和 Ecto 迁移对生产数据库进行更改。 使用这种方法,您不必接触生产数据库,并且您想要对生产数据库进行的任何更改都通过 Ecto 迁移文件完成。 这使得随着时间的推移回滚更改和跟踪对数据库的更改变得更加容易。

要了解有关 Ecto 迁移以及如何执行复杂数据库操作的更多信息,请参阅 官方 Ecto 迁移文档