Skip to content

Ruby on Rails - 数据库设置

在开始之前,请确保您的数据库服务器(例如 PostgreSQL 或 MySQL)正在运行。Ruby on Rails 通常为开发环境(development environment)、测试环境(testing environment)和生产环境(production environment)使用单独的数据库。按照惯例,如果您的应用名为 ‘myapp’,这些数据库将是:

  • myapp_development
  • myapp_production
  • myapp_test

虽然您可以手动创建这些数据库,但 Rails 提供了 Rake 任务,可以根据您的 config/database.yml 文件创建和管理它们。对于开发环境,您通常需要一个数据库用户,该用户具有创建数据库和表的权限。

使用 config/database.yml 进行现代数据库配置

Section titled “使用 config/database.yml 进行现代数据库配置”

Rails 使用 config/database.yml 文件连接到您的数据库。当您创建一个新的 Rails 应用(例如,rails new myapp -d postgresql)时,Rails 会生成此文件并带有合理的默认设置。强烈建议对敏感凭据(如密码)使用环境变量(environment variables),尤其是在生产环境中。

以下是 PostgreSQL 的示例。MySQL 设置类似,只需更改 adapter(适配器)。

default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: <%= ENV.fetch("DATABASE_HOST") { 'localhost' } %>
username: <%= ENV.fetch("DATABASE_USERNAME") { 'your_db_user' } %>
password: <%= ENV['DATABASE_PASSWORD'] %> # Store password in an environment variable
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
production:
<<: *default
database: myapp_production
username: myapp_prod_user # Potentially different user for production
password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>

关键变化和最佳实践:

  • 适配器 (Adapters):常见的选择是 postgresql、mysql2 或 sqlite3(如果未指定 -d 标志,这是新应用的默认设置)。
  • 环境变量 (Environment Variables):使用 ENV['YOUR_VARIABLE_NAME'] 或 ENV.fetch("YOUR_VARIABLE_NAME") { 'default_value' } 来配置主机 (host)、用户名 (username),尤其是密码 (password),这增强了安全性和灵活性。像 dotenv-rails 这样的 gem 可以帮助在开发环境中管理环境变量。
  • YAML 锚点 (YAML Anchors):&default 和 <<: *default 减少了重复。
  • 连接池 (Connection Pooling):pool 指定数据库连接的数量。这里通常使用 RAILS_MAX_THREADS。

一旦 config/database.yml 设置完毕,并且您的数据库服务器正在运行,用户具有创建数据库的权限(或者数据库已存在且用户具有访问权限),您可以使用 Rails 命令:

# 创建开发环境和测试环境数据库:
$ bin/rails db:create
# 运行迁移(根据 db/migrate 文件创建表):
$ bin/rails db:migrate
# 设置测试环境数据库模式(对测试很有用):
$ bin/rails db:test:prepare

手动创建数据库和用户(以 PostgreSQL 为例)

Section titled “手动创建数据库和用户(以 PostgreSQL 为例)”

如果您更喜欢手动创建用户和数据库,这里有一个 PostgreSQL 示例。首先,创建一个数据库用户(例如,myapp_user):

$ sudo -u postgres createuser --interactive --pwprompt
Enter name of role to add: myapp_user
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n

然后,您可以让 Rails 使用 bin/rails db:create(在 database.yml 中配置好此用户)来创建数据库,或者手动创建它们:

$ sudo -u postgres psql
postgres=# CREATE DATABASE myapp_development OWNER myapp_user;
postgres=# CREATE DATABASE myapp_test OWNER myapp_user;
postgres=# CREATE DATABASE myapp_production OWNER myapp_user; # 通常位于单独的生产服务器上
postgres=# \q

对于 MySQL,命令会有所不同(例如,CREATE USER、GRANT PRIVILEGES、CREATE DATABASE)。请参考 MySQL 文档了解具体信息。

SQLite 是新 Rails 应用的默认设置,因为它基于文件且不需要独立的服务器,这对初学者来说很容易。然而,对于更接近生产环境的开发以及生产环境本身,PostgreSQL 和 MySQL 是更健壮、更常见的选择。请选择最适合您的项目需求和运行环境的数据库。

配置好数据库后,下一步是通过模型 (models) 和迁移 (migrations) 定义应用程序的数据结构。这些将在后续章节中介绍。