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

Posted

技术标签:

【中文标题】在新的 Rails 项目中从 SQLite 更改为 PostgreSQL【英文标题】:Change from SQLite to PostgreSQL in a fresh Rails project 【发布时间】:2011-10-06 08:12:23 【问题描述】:

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

反正听说SQLite本地的开发数据库不用改,所以不用改,但是生产环境从SQLite改成PostgreSQL怎么办呢?

以前有没有人这样做过并且可以提供帮助?

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

【问题讨论】:

您是否有需要使用的实时生产数据,或者它是一个新的/新鲜的应用程序? 我建议您也将开发环境更改为 PostgreSQL。 SQLite 和 PostgreSQL(以及所有其他数据库)对“有效 SQL”的含义有不同的看法,并且没有 ORM 可以将您与数据库的所有特性隔离开来。 【参考方案1】:

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

【讨论】:

我应该放 project_test 还是我的数据库名称? 您可以随意命名。如果您的项目名称是“计算器”,我会将它们命名为calculator_production、calculator_test、calculator_development @mmichael 这真的取决于你如何设置你的 postgres。如果您使用的是 MacOS X Lion+,则使用 postgres.app、brew 或 native 对其默认设置有不同的限制。因此,如果用户名和密码不适用,您可以将它们排除在外,或者不输入任何值。这更像是一种“包罗万象”的配置。 '&TEST' 在里面做什么(第 9 行)? "&TEST" 将 TEST 设置为默认选项集。它们以后可以被覆盖或被忽略。 "的方式 【参考方案2】:

以下步骤对我有用。它使用由 Heroku 创建并在 Ryan Bates 的 Railscast #342 中提到的 taps gem。有几个步骤,但效果很好(甚至日期也被正确迁移),而且比我过去所做的 Oracle -> DB2 或 SQL Server -> Oracle 迁移要容易得多。

请注意,SQLite 没有用户 ID 或密码,但 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 网络服务器

$ rails s

清理 Gemfile

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

这是一个很好的答案,它用所需的值更改了 database.yml。您仍然可以进入那里并根据您的项目更改数据库名称。【参考方案4】:

由于您要迁移到 heroku,因此您可以使用点击来执行此操作:

heroku db:push

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

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

RAILS_ENV=production heroku db:push

【讨论】:

水龙头 gem 似乎不适用于 1.9.3,您可能需要在本地安装 1.9.2 以使其运行 - 一旦我这样做了,它就非常流畅github.com/ricardochimal/taps/issues/93 这已经不可能了。有关更多信息,请参阅此问题:***.com/questions/19817851/…【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

我上面已经提到过它,但我作为潜伏者的声誉不足以支持它。希望能引起 Rails 新手阅读此答案的更多关注:

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

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

【讨论】:

【参考方案9】:

在 gemfile 中用 gem pg 替换 gem 'sqlite3 后,我在推送到 Heroku 主服务器时不断收到 sqlite3 error,因为我忘记提交更新的 gemfile。只需执行以下操作即可解决此问题:

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

您可以尝试以下操作: sqlite3 development.db .dump | psql dbname username

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

【讨论】:

【参考方案12】:

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

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

【讨论】:

【参考方案13】:

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

【讨论】:

以上是关于在新的 Rails 项目中从 SQLite 更改为 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中将我的数据库从 SQLite 更改为 MYSQL

如何在新的 Apple Developer 网站上将 AdHoc 分发更改为 AppStore?

OroPlatform:在新选项卡中从 application_menu 打开项目

如何在 localhost:8000 中从 Laravel 的一个项目更改为另一个项目?

在新的 discordjs 中从 DM 向用户添加角色

将数据库从 MySQL 更改为 SQLite 后出现 Java 项目错误