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


125

我有一个Rails应用程序,该数据库的数据库位于SQLite中(开发人员和生产人员)。由于我要迁移到heroku,因此我想将数据库转换为PostgreSQL。

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

以前有没有人做过并且可以帮助您?

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


2
您是否需要实时生产数据,还是新的/新鲜的应用程序?
Dylan Markow

19
我建议您也将开发环境更改为PostgreSQL。SQLite和PostgreSQL(以及其他所有数据库)对“有效的SQL”的含义有不同的想法,并且ORM不能使您与数据库的所有特性相隔离。
亩太短了,

Answers:


101

您可以将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

1
我应该输入project_test还是数据库名称?
Vasseurth'7

5
您可以随意命名。如果您的项目名称是'calculator',我将其命名
Chris Barretto

2
@mmichael确实取决于您如何设置postgres。如果您使用的是MacOS X Lion +,则使用postgres.app,brew或native对其默认设置有不同的限制。因此,如果用户名和密码不适用,则可以不输入或不输入任何值。这仅仅是一种“全部捕获”类型的配置。
克里斯·巴雷托

2
那里的“&TEST”在做什么(第9行)?
大卫·罗登

2
“&TEST”将TEST设置为默认选项集。以后可以覆盖它们或将其忽略。“ <<:* TEST”是访问默认@DavidRhoden的方式
Chris Barretto

44

以下步骤对我有用。它使用水龙头由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

10

由于您要移至heroku,因此可以使用水龙头来执行此操作:

heroku db:push

这会将您的本地开发sqlite数据推入生产环境,而heroku将自动为您转换为postgres。

这也可以将生产sqlite数据库推送到heroku,但尚未经过测试。

RAILS_ENV=production heroku db:push

1
taps gem似乎无法在1.9.3上正常运行,您可能需要在本地安装1.9.2才能运行它-一旦我做到了,它就变得非常流畅github.com/ricardochimal/taps/issues/93
sbeam 2012年

这不再可能。有关更多信息
请参见此


5

只需更新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'

5

现在,只需单个命令即可轻松完成

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

1
这是一个很好的答案,它使用所需的值更改了database.yml。您仍然可以进入该目录并根据您的项目更改数据库名称。
csalmeida

3

用gemfile中的'sqlite3gem 替换了gem之后pgsqlite3 error当我推送到Heroku master时,我一直得到该信息,因为我忘记了提交更新的gemfile。只需执行以下操作即可解决此问题:

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

3

只需更新您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等。因此在上面的代码中,我们不会一次又一次重复相同的代码。


2

在我上面已经提到过它,但是作为潜伏者,我没有足够的声誉可以投票。希望吸引更多的Rails新手阅读此答案:

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

^^^这是除了将选定的答案中描述的database.yml文件迁移到Postgres之外的关键部分。


1

这就是我的设置方式。如果仅使用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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.