我有一个Rails应用程序,该数据库的数据库位于SQLite中(开发人员和生产人员)。由于我要迁移到heroku,因此我想将数据库转换为PostgreSQL。
无论如何,我听说不需要从SQLite更改本地开发数据库,所以我不需要更改它,但是,如何将生产环境从SQLite更改为PostgreSQL?
以前有没有人做过并且可以帮助您?
PS:我不确定这个过程到底叫什么,但是我听说过将数据库从SQLite迁移到PostgreSQL,这需要做些什么吗?
我有一个Rails应用程序,该数据库的数据库位于SQLite中(开发人员和生产人员)。由于我要迁移到heroku,因此我想将数据库转换为PostgreSQL。
无论如何,我听说不需要从SQLite更改本地开发数据库,所以我不需要更改它,但是,如何将生产环境从SQLite更改为PostgreSQL?
以前有没有人做过并且可以帮助您?
PS:我不确定这个过程到底叫什么,但是我听说过将数据库从SQLite迁移到PostgreSQL,这需要做些什么吗?
Answers:
您可以将database.yml更改为此,而不必使用开箱即用的sqlite之一:
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
以下步骤对我有用。它使用水龙头由Heroku创建并在Ryan Bates的Railscast#342中提到宝石。有几个步骤,但它工作得很好(即使正确地迁移了日期),它也比我过去完成的Oracle-> DB2或SQL Server-> Oracle迁移要容易得多。
请注意,SQLite没有用户名或密码,但是taps gem需要一些东西。我只使用了文字“用户”和“密码”。
为新数据库创建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
更新database.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 Web服务器
$ rails s
清理Gemfile
#gem 'sqlite3'
gem 'pg'
#gem 'taps'
$ bundle
由于您要移至heroku,因此可以使用水龙头来执行此操作:
heroku db:push
这会将您的本地开发sqlite数据推入生产环境,而heroku将自动为您转换为postgres。
这也可以将生产sqlite数据库推送到heroku,但尚未经过测试。
RAILS_ENV=production heroku db:push
您还需要在您的gemfile中添加“ gem'pg ' ”行,“ pg”是Rails的当前postgres gem。
只需更新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'
只需更新您datatbase.yml
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
我们正在使用rails,应该遵循基本标准,例如DRY,Conference over Configuration等。因此在上面的代码中,我们不会一次又一次重复相同的代码。
在我上面已经提到过它,但是作为潜伏者,我没有足够的声誉可以投票。希望吸引更多的Rails新手阅读此答案:
您还需要将行“ gem'pg'”添加到您的gemfile中,“ pg”是Rails的当前postgres gem。
^^^这是除了将选定的答案中描述的database.yml文件迁移到Postgres之外的关键部分。
这就是我的设置方式。如果仅使用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
您可以尝试以下操作:
sqlite3 development.db .dump | psql dbname username
或尝试使用sqlitetopgscript:http ://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg
一个可能的解决方案(不适用于heroku)是使用来自以下位置的yaml.db:
今天我有同样的问题。我正在使用Rails 4.2.8。解决方案是指定pg gem版本,在我的例子中是0.18.4
。