【Rails】一种比任何地方都更友好地将SQlite3从开发环境转换成PostgreSQL的方法!

为了什么

在使用Paas平台Render.com将应用部署到生产环境时,指定了使用PostgreSQL作为数据库。
Rails的默认数据库是SQlite3,所以需要切换到PostgreSQL。
本文记录了只将测试和开发环境保持为SQlite3,只有生产环境切换到PostgreSQL的步骤。

步骤

使用Rails new创建一个新应用程序。

这一次我们将最终解释如何部署到Render.com。我们将创建一个名为Render_app的应用程序。

在机场候机厅

$ rails new Render_app
...
$ cd Render_app

我会在此时在GitHub上创建一个仓库。

环境

我创建的项目版本如下。

$ ruby -v
=> ruby 3.1.2p20

$ rails -v
=> Rails 7.0.4

准备使用PostgreSQL

通过Homebrew在Mac上安装postgreSQL。

如果您已经使用Ruby,我想您可能已经安装了Homebrew,但我还是提供了安装方法的参考链接。
https://prog-8.com/docs/ruby-env

让我们在终端中下载最新稳定版本的postgresql。

$ brew install postgresql
...

# 導入確認
$ psql --version
=> psql (PostgreSQL) 14.5 (Homebrew)

PostgreSQL的初始配置

安裝完PostgreSQL後,需要進行一些初始設定才能開始使用。

数据库的初始化

首先,我们会初始化数据库。

$ initdb /usr/local/var/postgres -E utf8

启动和停止PostgreSQL

启动和停止PostgreSQL可以使用以下命令进行操作。

# 立ち上げ
$ brew services start postgresql
==> Successfully started `postgresql@14` (label: homebrew.mxcl.postgresql@14)

# 停止
$ brew services stop postgresql
==> Successfully stopped `postgresql@14` (label: homebrew.mxcl.postgresql@14)

用户设置 hù

在启动了PostgreSQL的情况下,我们将进行用户设置。

$ createuser -s -P <ユーザー名>
Enter password for new role: <パスワードを設定>
Enter it again: <サイドパスワードを入力>

在这种情况下,我们要小心,因为输入的密码不会显示出来。

当用户设置完成后,将停止PostgreSQL。

将PostgreSQL引入Rails应用程序

一旦准备就绪,我们将在Rails应用程序中引入PostgreSQL。

编辑Gemfile

我将把SQlite3的gem迁移到开发和测试环境中。

- # Use sqlite3 as the database for Active Record
- gem "sqlite3", "~> 1.4"

+ group :development, :test do
+   # Use sqlite3 as the database for Active Record
+   gem "sqlite3"
+   ()
+ end

这时候,我们删除了版本指定,始终使用最新版本。

下一步,我们指定将在生产环境中使用PostgreSQL。

group :production do
  # Use PstgreSQL as the database for Active Record
  gem 'pg'
end

如果编辑了Gem文件

$ bundle install

做了。

环境设置

为了在每个环境中指定要使用的数据库设置,我们将进行环境配置。

编辑database.yml

数据库设置在config/database.yml文件中指定。

编辑如下所示:

之前

# SQLite. Versions 3.8.0 and up are supported.
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem "sqlite3"
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: db/production.sqlite3

↓之后

default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

test:
  <<: *default
  database: db/test.sqlite

production:
  adapter: postgresql
  encoding: unicode
  pool:  <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  database: <任意のデータベース名>
  username: <任意のユーザー名>
  password: <%= ENV['DB_PASSWORD'] %> # .envで設定

設置環境變數

上述的database.yml文件将上传到GitHub。
如果直接在该文件中输入在生产环境中使用的数据库访问密码,可能会发生非法访问的风险。
因此,我们需要创建一个名为.env的文件,并将重要信息写入该文件。
yml文件的最后一行的Ruby表达式<%= ENV[‘DB_PASSWORD’] %>指示从.env文件中提取值。

以下是创建.env文件的步骤,请看下文。

首先,您需要安装 dotenv-rails 这个 Gem 文件以供生产环境使用。

group :production do
  ()
  # 環境変数の設定
  gem 'dotenv-rails'
end
$ bundle install

在项目文件夹的直属下创建.env.production文件并填写密码。

DB_PASSWORD = '<任意のパスワード>'
在此阶段,尚未创建用于生产环境的数据库,因此密码尚未生成。只需创建.env.production文件即可。

我明白在 database.yml 中直接写密码是不安全的,但如果 .env.production 被盗了,那么一切都会毁于一旦吧?

沒錯。

所以,我們要設定不要將.env.production上傳到GitHub。

在项目文件夹的根目录下创建.gitignore文件。
该文件中列出的文件将不会被提交到git。
在.gitignore中添加以下内容。

()
.env.production
スクリーンショット 2022-09-25 10.09.24.png

确实可以看出.env.production没有被推送。
如果发现.gitignore中指定的文件已经上传了,请参考下面的文章重新推送。

 

由于.gitignore文件的文件名错误并已经被push了,所以请你也检查一下那个地方。

创建数据库

终于准备好了。
让我们开始建立数据库吧。
在终端上操作。

$ bundle exec rails db:create

在PostgreSQL中执行,并且如果出现如下信息,那么数据库创建就完成了。

Created database 'db/development.sqlite3'
Created database 'db/test.sqlite'

哎?你可能会认为这是一个被创建的数据库,但实际上,现在我只是处于开发环境,所以这就足够了。

在实际的生产环境中运行数据库的方法将在下篇文章中介绍。

总结

以上是介绍了将SQLite3从开发环境转换为生产环境的PostgreSQL的方法。

希望本文对某人有所帮助的同时,深表感谢下列各种介绍的文章。

参考文献

在Ruby on Rails的新项目中,将数据库从SQLite3变更为PostgreSQL。

在Mac上安装和初始化PostgreSQL的方法

【Rails】设置和获取环境变量(.env)的方法。

Rails指南#数据库设置

广告
将在 10 秒后关闭
bannerAds