【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 = '<任意のパスワード>'
我明白在 database.yml 中直接写密码是不安全的,但如果 .env.production 被盗了,那么一切都会毁于一旦吧?
沒錯。
所以,我們要設定不要將.env.production上傳到GitHub。
在项目文件夹的根目录下创建.gitignore文件。
该文件中列出的文件将不会被提交到git。
在.gitignore中添加以下内容。
(略)
.env.production

确实可以看出.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指南#数据库设置