2

我正在尝试将开发(和测试/生产)数据库切换到 PostgreSQL,以便我可以将我的 rails 应用程序部署到 Heroku。

按照他们的指示和 railscast 并在 StackOverflow 和 Google 周围寻找重写我的 database.yml 文件并做其他所有事情的正确方法,但我遇到了很多问题,所以我希望有人能帮我弄清楚我还需要做什么。我将在下面解释我尝试过的内容。

一个主要问题是如何处理我的 database.yml 文件。许多站点不同意,或者根本没有任何池或用户名或编码条目(或者,就此而言,整个生产环境)。这是我环顾四周并结合后得到的结果。这应该工作吗?:

development:
  adapter: postgresql
  encoding: unicode
  database: <appname>_development
  pool: 5
  username: <username>
  password: <password>

test:
  adapter: postgresql
  database: <appname>_test
  username: <username>
  password: <password>
  host: localhost

什么是池?我需要编码吗?为什么这么多示例在 yml 文件中没有生产部分?

根据 Railscast 的建议,我自制安装了 PostgreSQL,然后初始化了数据库,然后执行了这一行。

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

在另一个 StackOverflow 回答之后,我确保我的 Postgres 位于 /usr/local/bin/postgres 目录中,并将这一行添加到我的 .bash_profile 文件中。

export PATH="/Applications/Postgres.app/Contents/MacOS/bin:$PATH"

同样根据 Railscast 的建议,我安装了 taps gem,并执行了以下几行:

taps server sqlite://db.development.sqlite3 <username> <password>

然后打开一个新选项卡并执行:

taps pull postgresql://<username>@localhost/<appname>_development http://localhost//5000

但是当我输入时,我收到以下错误:

Failed to connect to database:
  Sequel::AdapterNotFound -> LoadError: cannot load such file -- sequel/adapters/postgresql

当然我做错了。(例如,我应该从 sqlite3 数据库中提取吗?我怎么知道它的 url?)。但我不知道如何开始故障排除,所以我想我会寻求帮助。

谢谢!

4

5 回答 5

8

Heroku,以及“database.yml”文件的“生产”部分

Heroku 将忽略您的database.yml文件对生产的任何内容。productionHeroku 将自动为 Bamboo 和 Cedar 堆栈注入自己的配置。换一种说法 -production留空 - 部署到 Bamboo 或 Cedar 堆栈时不需要它。

另一方面,如果您要部署到 Amazon Web Services,但使用Heroku托管的 Postgres 解决方案作为您的后端数据库(它本身运行在 AWS 之上),您需要productiondatabase.yml.

“水龙头”宝石

这似乎是一个允许您将数据从现有数据库(SQLite,为您)迁移到新数据库(PostgreSQL,我希望您从现在开始用于本地开发)的 gem。我没有读太多,但我猜它taps使用 ActiveRecord(或其他 ORM 解决方案)从它支持的任何数据库中读取记录,然后使用 ActiveRecord 将数据写回目标数据库。通过使用 ActiveRecord 作为一种数据库间翻译器,您无需编写特定于数据库的查询来移动数据。

话虽如此,如果您的本地数据库只是开发数据,并假设它可以重新创建(应该是 - 它只是开发数据),那么您可能可以taps完全放弃使用。简单地不要将您的开发数据从 SQLite 迁移到 Postgres - 只需停止使用 SQLite 并开始使用带有空数据库的 Postgres,并且所有迁移都已运行,或者db:schema:load在其上运行。

可以通过Populator创建易于随心所欲地重新创建的出色开发数据(为了您未来的需求 - 我现在不会太担心)。

“无法连接到数据库:”错误

你安装pggem吗?那是您在 Rails 中与 PostgreSQL 服务器通信所需的宝石。我对该错误的解释表明您只是缺少pg宝石,因此,“Sequel::AdapterNotFound”

游泳池

池是您希望从您的应用程序向数据库提供的并发连接数。使用 SQLite,您可以指定它以允许一定数量的并发读取。SQLite (与其文档所暗示的相反)不支持并发写入

当您的应用程序由多个 Web 实例提供服务时,该池在生产环境中很有用。池指定与数据库的最大并发连接数,通常您的 Web 服务器将使用一个连接,每个活动请求,每个线程,或大约。我在这里捏造了技术细节,但关键是您需要支持的并发性(同时请求越多),您可能需要的可用连接就越多。

如前所述,无论如何,这在 Heroku 上都会被忽略,因此指定它是没有意义的,并且在本地开发中,您可能一次只会发出一个请求,因此将其设置为1可能看起来与将其设置为5.

那么,当池中的所有连接当前都在使用时会发生什么?任何后续请求都会排队,直到连接可用或连接超时,以先到者为准。

这里有更多关于连接池的信息。

于 2012-09-17T19:42:45.543 回答
3

Taps 使用 Sequel,而 Sequel 使用postgres://...而不是postgresql://...用于连接字符串。试试:taps pull postgres://<username>@localhost/<appname>_development http://localhost//5000

于 2012-09-18T16:24:22.777 回答
1

我最近这样做了,我的 database.yml 只使用:

development:
  adapter: postgresql
  username: my_user
  database: my_project_development

如果你在 Heroku 上的 Postgres 数据库中有数据,你可以做一个heroku db:pull填充你的 Postgres 开发数据库。否则,您可能会将 db:push的 Sqlite 数据(来自您的机器,使用旧的 database.yml 配置)传输到 Heroku,更新您的 database.yml,然后执行db:pull.

于 2012-09-17T19:33:18.607 回答
1

这通常是我用于 postgres 的:

production:
  adapter: postgresql
  encoding: utf8
  database: app_name
  pool: 5
  host: localhost
  username: username
  password: password

另外,请记住 yaml 可能会很糟糕,因此请务必避免使用制表符并在格式中仅使用空格。

于 2012-09-18T12:12:18.290 回答
1

10 分钟将您的 RoR 应用程序从 SQLite 迁移到 Postgres

这是假设您在 sqlite 中有一个开发数据库,​​并且您希望将结构和数据移动到 postgres。

您需要先使用具有您的用户名的用户在本地安装和配置 Postgres,这里是 postgres 安装文档


所需软件:postgresql、pgloader


脚步

  1. 安装 pgloader / postgres,并确保你的系统上正在运行 postgresql
  2. 备份 sqlite - 将 development.sql 复制到 development_old.sql
  3. 添加gem 'pg'到 Gemfile 的主要部分
  4. 捆绑安装
  5. 更新 config/database.yml(参见下面的示例)
  6. 耙分贝:设置
  7. cd [应用程序根目录]
  8. 使用来自 sqlite 的数据加载 postgres db

pgloader ./db/development.sqlite3 postgresql:///[name of postgres dev db]

  1. gem 'sqlite3'从您的 gemfile中删除
  2. 捆绑安装
  3. 启动服务器 -rails server
  4. 通过在 localhost:3000 访问应用程序进行测试

如果您遇到问题或边缘情况,这里有一些资源可以提供帮助。

资源:

database_sample.yml

default: &default
  adapter: postgresql
  encoding: unicode
  host: localhost
  port: 5432
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: [name of app]_dev

test:
  <<: *default
  database: [name of app]_test

staging:
  <<: *default
  database: [name of app]

production:
  <<: *default
  database: [name of app]
于 2018-06-27T17:54:47.683 回答