如何在Ubuntu 16.04上使用MySQL部署Elixir-Phoenix应用程序

在教程中如何使用Distillery和edeliver自动化Elixir Phoenix部署,您创建了一个没有...的Phoenix应用程序...

介绍

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

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

在本指南中,您将使用Phoenix-EctoMariaex将现有的Phoenix应用程序配置为连接到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

您将在安装依赖关系时看到此输出:

Running 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进程来实现并发和容错。 主管管理这些流程并重新启动它们,如果它们崩溃的话。 监事也可以监督其他监事,这种结构被称为监督树

您刚刚添加的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存储库,以便您可以使用Mix任务(如ecto.createecto.migrate来创建和管理数据库。

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

nano config/config.exs

在文件末尾找到以下行:

〜/ myproject的/配置/ config.exs
import_config "#{Mix.env}.exs"

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

〜/ myproject的/配置/ config.exs
...

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

保存更改并关闭文件。

现在您已经配置了Ecto,接下来将您的数据库凭据添加到应用程序。

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

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

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

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

nano config/dev.exs

自从我们使用MySQL以来,添加以下行来将数据库适配器配置为Ecto.Adapters.MySQL

〜/ myproject的/配置/ dev.exs
config :myproject, Myproject.Repo,
  adapter: Ecto.Adapters.MySQL

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

〜/ myproject的/配置/ dev.exs
config :myproject, Myproject.Repo,
  adapter: Ecto.Adapters.MySQL,
  database: "myproject_dev"

在这里,我们将开发数据库名称定义为myproject _dev 这是Phoenix应用程序用于数据库的命名约定。 遵循这个约定,生产数据库将被称为myproject _prod和测试数据库myproject _test 您可以改用自己的命名方案。

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

〜/ myproject的/配置/ dev.exs
config :myproject, Myproject.Repo,
  adapter: Ecto.Adapters.MySQL,
  database: "myproject_dev",
  username: "root",
  password: "password",
  hostname: "localhost"

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

〜/ myproject的/配置/ dev.exs
config :myproject, Myproject.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: "root",
  password: "password",
  database: "myproject_dev",
  hostname: "localhost",
  pool_size: 10

保存并关闭dev.exs

接下来,配置您的测试环境。 打开测试环境配置文件test.exs

nano config/test.exs

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

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

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

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

〜/ myproject的/配置/ 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的/配置/ 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已成功创建数据库:

...
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;

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

Query 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 /地址以确保应用程序仍然有效。 如果它没有启动,或者您看到编译错误,请在继续之前查看本教程中的步骤并解决它们。

如果一切按预期工作,请在终端中按CTRL+C两次以停止服务器。

然后,用Git提交更改。 每次您对项目进行更改时都必须这样做,因为edeliver使用Git将代码从最新的提交推送到构建服务器以进行进一步操作。

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

最后,使用edeliver来更新生产服务器上的应用程序。 在升级在生产计算机上运行的应用程序之前,以下命令将生成并部署最新版本的项目,而不会停机。

mix edeliver upgrade production

您将看到以下输出:

EDELIVER 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!

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

警告:以下命令会导致您的应用程序短时间脱机。

mix edeliver restart production

你会看到这个输出:

EDELIVER 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
EDELIVER 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生成器创建地址簿,而不是从头开始编写地址簿的代码。 PhoenixGenerators是为简单的CRUD(创建,读取,更新,删除)功能生成代码的实用程序。 这为您可能想要构建的许多应用程序功能提供了一个很好的起点。

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

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

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

上下文是一个将包含相关资源功能的模块。 例如,如果您打算维护在您的网站上注册的用户列表以及用户登录时的会话日志,则将用户和会话置于名为“帐户”的单个上下文模块下是有意义的。

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

让我们用发生器创建地址簿。 为了保持地址簿的简单性,我们将每个记录包括三个字段 - 名称,电子邮件和邮政编码。 我们将每个条目称为Address ,将多个条目称为addresses以及地址簿应该作为AddressBook的上下文。

运行以下命令生成地址簿:

mix phx.gen.html AddressBook Address addresses name:string email:string zip_code:integer
* 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 /回购/迁移/ 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

在此功能中,PhoenixGenerators已经编写了代码,以便与您提供的字段一起创建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

输出显示迁移已成功运行,并显示迁移文件的时间戳:

EDELIVER 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

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

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

mix phx.server

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

如果您满意本地工作正常,请返回到您的终端并按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迁移文档