在新的 Rails 项目中从 SQLite 更改为 PostgreSQL

我有一个 Rails 应用程序,它的数据库在 SQLite (开发和生产)中。因为我要转移到 heroku,所以我想把我的数据库转换成 PostgreSQL。

无论如何,我听说本地、开发、数据库不需要从 SQLite 更改,所以我不需要更改,但是,如何将生产环境从 SQLite 更改为 PostgreSQL?

以前有人这么做过吗,能帮上忙吗?

另外,我不确定这个过程到底叫什么,但是我听说过将数据库从 SQLite 迁移到 PostgreSQL,这是需要做的吗?

75681 次浏览

Since you're moving to heroku, you can use taps to do this:

heroku db:push

这将把您的本地开发 sqlite 数据推向生产,heroku 将自动为您转换 postgres。

这也可以将生产 sqlite db 推送到 heroku,但是没有经过测试。

RAILS_ENV=production heroku db:push

你可以试试以下方法: sqlite3 development.db .dump | psql dbname username

或者试试 sqlitetopgscript: http://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg

您可以将 datase.yml 更改为这个值,而不必使用开箱即用的 sqlite one:

development:
adapter: postgresql
encoding: utf8
database: project_development
pool: 5
username:
password:


test: &TEST
adapter: postgresql
encoding: utf8
database: project_test
pool: 5
username:
password:


production:
adapter: postgresql
encoding: utf8
database: project_production
pool: 5
username:
password:


cucumber:
<<: *TEST

您还需要添加行“ Gem‘ pg’”到您的 gemfile 中,‘ pg’是当前的 postgres gem for Rails。

一个可能的解决方案(不适用于 heroku)是使用 yaml.db:

Http://www.railslodge.com/plugins/830-yaml-db

上面已经提到过了,但是我作为一个潜水者还没有足够的名声来支持它。为了吸引更多的关注,Rails 的新手们正在阅读这个问题的答案:

您还需要添加行“ gem‘ pg’”到您的 gemfile 中,‘ pg’是当前的 postgres gem for Rails。

^ ^ ^ 这是除了所选答案中描述的将您的 Rails 应用程序迁移到 Postgres 的 datase.yml 文件之外的一个关键部分。

下面的步骤对我很有效。它使用了由 Heroku 创建并在 Ryan Bates 的 Railscast # 342中提到的 水龙头 gem。有几个步骤,但它工作得很完美(甚至日期都被正确地迁移了) ,而且比我过去所做的 Oracle-> DB2或 SQL Server-> Oracle 迁移要容易得多。

Note that SQLite does not have a user id or password, but the taps gem requires something. I just used the literals "user" and "password".

为新数据库创建 Postgres 数据库用户

$ createuser f3
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) y

编辑-下面更新的命令-使用此代替

$ createuser f3 -d -s

创建所需的数据库

$ createdb -Of3 -Eutf8 f3_development
$ createdb -Of3 -Eutf8 f3_test

更新 Gemfile

gem 'sqlite3'
gem 'pg'
gem 'taps'
$ bundle

更新 datase.yml

#development:
#  adapter: sqlite3
#  database: db/development.sqlite3
#  pool: 5
#  timeout: 5000


development:
adapter: postgresql
encoding: unicode
database: f3_development
pool: 5
username: f3
password:


#test:
#  adapter: sqlite3
#  database: db/test.sqlite3
#  pool: 5
#  timeout: 5000


test:
adapter: postgresql
encoding: unicode
database: f3_test
pool: 5
username: f3
password:

启动 sqlite 数据库上的 Taps 服务器

$ taps server sqlite://db/development.sqlite3 user password

迁移数据

$ taps pull postgres://f3@localhost/f3_development http://user:password@localhost:5000

重新启动 Rails 网络服务器

$ rails s

Cleanup the Gemfile

#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle

在 gemfile 中用 gem pg替换了 gem 'sqlite3之后,当我推送到 Heroku master 时,我一直得到 sqlite3 error,因为我忘记提交更新后的 gemfile。简单地做下面的事情就可以解决这个问题:

git add .
git commit -m 'heroku push'
heroku create
git push heroku master

更新你的数据库

development: &development
adapter: postgresql
database: Your_database_name
username: user_name
password: password
host:     localhost
schema_search_path: public
min_messages: warning


test:
<<: *development
database: test_database_name


production:
<<: *development
database: production_db_name

我们正在使用轨道,基本标准应该遵循,如干燥,约定优于配置等。所以在上面的代码中,我们不会一遍又一遍地重复相同的代码。

我就是这么设置的。如果只使用 MRI 而不使用 Jruby,则可以跳过适配器设置中的逻辑。

defaults: &defaults
adapter: <%= RUBY_ENGINE == 'ruby' ? 'postgresql' : 'jdbcpostgresql' %>
encoding: unicode
pool: 5
timeout: 5000


development:
database: project_development
<<: *defaults


test:
database: project_test
<<: *defaults


production:
database: project_production
<<: *defaults

只需更新 config/database. yml 文件:

default: &default
adapter: postgresql
encoding: unicode
pool: 5


development:
<<: *default
database: projectname_development


test:
<<: *default
database: projectname_test


production:
<<: *default
database: projectname_production
username:
password:

以上是运行时生成的内容:

$ rails new projectname --database=postgresql --skip-test-unit

还要把这个添加到你的 Gemfile:

gem 'pg'

今天我也遇到了同样的问题。我在做 Rails 4.2.8。解决方案是指定 pg gem 版本,在我的例子中是 0.18.4

现在只需一个命令就可以轻松实现

bin/rails db:system:change --to=postgresql