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

我有一个Rails应用程序,数据库在SQLite(开发和生产)。 由于我正在转向heroku,我想将我的数据库转换为PostgreSQL。

无论如何,我听说本地开发数据库不需要从SQLite中更改,所以我不需要改变,但是,我怎样才能把生产环境从SQLite转换到PostgreSQL呢?

有没有人曾经这样做,可以帮助?

PS我不确定这个过程是怎么调用的,但是我听说过从SQLite到PostgreSQL的数据库迁移,那么需要做什么?

你可以改变你的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创build的水龙头gem,并在Ryan Bates的Railscast#342中提到。 有几个步骤,但工作完美(甚至date被正确迁移),它比我以前做的Oracle – > DB2或SQL Server – > Oracle迁移要容易得多。

请注意,SQLite没有用户名或密码,但水龙头gem需要的东西。 我只是使用文字“用户”和“密码”。

为新数据库创buildPostgres数据库用户

 $ 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 

创build所需的数据库

 $ 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数据库上启动tap服务器

 $ 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,但它没有testing。

 RAILS_ENV=production heroku db:push 

您还需要将“gem'pg ' ”行添加到您的gem文件中,'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,Convention over Configuration等一样遵循。所以在上面的代码中我们不是一再重复相同的代码。

上面已经提到了我,但是我没有足够的声望来作为一个潜伏者来升级它。 希望能够引起Rails新手们更多的关注:

您还需要将“gem'pg'”行添加到您的gem文件中,'pg'是当前Rails的postgres gem。

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

在gemfile中用gem pgreplacegem'sqlite3之后,当我推送到Heroku master时,我不断地收到sqlite3 error ,因为我忘记了提交更新的gemfile。 只要做到以下解决这个问题:

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

这是我有我的设置。 如果您只使用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 sqlite3 development.db .dump | psql dbname username

或尝试使用sqlitetopgscript: http ://trac-hacks.org/browser/sqlitetopgscript/0.10/sqlite2pg

一个可能的解决scheme(不适用于heroku)是从以下使用yaml.db:

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