尝试从 SQLite 切换到 PostgreSQL

Posted

技术标签:

【中文标题】尝试从 SQLite 切换到 PostgreSQL【英文标题】:Trying to switch from SQLite to PostgreSQL 【发布时间】:2015-05-13 20:24:47 【问题描述】:

我在开发和测试中使用 SQLite,在 Heroku 上的生产中使用 PostgreSQL。我想用 PostgreSQL 替换 SQLite。我在 Cloud9 环境(Rails 4)中编程。我没有可能丢失的数据。

我做了什么:

首先,我编辑了database.yml:

default: &default
      adapter: postgresql
      encoding: unicode
      pool: 5
development:
  <<: *default
  database: app_development
test:
  <<: *default
  database: app_test
production:
  <<: *default
  database: app_production

然后:

在 Gemfile 中,我仅将 gem 'pg' 从生产环境移动到所有环境并删除了 gem 'sqlite3' 我跑了bundle install。 我跑了sudo service postgresql start 我跑了sudo sudo -u postgres psql 并输入create database "app_development"; 输入\q

更新:我添加了以下附加步骤:

我在 psql 中使用CREATE USER my_username SUPERUSER PASSWORD 'my_password'; 创建了一个新用户 在 database.yml 我添加了 usernamepassword 在 database.yml 我添加了host: myurl.c9.io 我在psql中输入:GRANT ALL ON DATABASE app_development to my_username

运行sudo sudo -u postgres psql 然后\list 产生:

      Name          |  Owner   | Encoding  | Collate | Ctype |   Access privileges   
 postgres           | postgres | SQL_ASCII | C       | C     | 
 template0          | postgres | SQL_ASCII | C       | C     | =c/postgres          +
                    |          |           |         |       | postgres=CTc/postgres
 template1          | postgres | SQL_ASCII | C       | C     | =c/postgres          +
                    |          |           |         |       | postgres=CTc/postgres
 app_development    | postgres | SQL_ASCII | C       | C     | 

我在这里没有看到我的用户名是 app_development 的所有者...

错误:运行rake db:migrate超时,声明PG::ConnectionBad: could not connect to server: Connection timed out Is the server running on host "myurl.c9.io" (ip address) and accepting TCP/IP connections on port 5432?

为什么与 PostgreSQL 的连接会失败?

【问题讨论】:

您没有在 database.yml 中提及用户名/密码 .... 我应该如何设置密码?我输入了sudo sudo -u postgres psql,然后输入了\password,然后输入了我的新密码。在 database.yml 中,我知道我应该包含 username: &lt;%= ENV['USERNAME'] %&gt;password: &lt;%= ENV['PASSWORD'] %&gt;host: &lt;%= ENV['IP'] %&gt;。然后我应该在哪个文件中实际输入我的密码(也许在 config\secrets.yml 中?)?另外两个变量应该是什么? 【参考方案1】:

将database.yml文件的内容替换为:

default: &default
  adapter: postgresql
  host: localhost
  username: yourusername
  password: yourpassword
  timeout: 5000
  port: 5432
development:
  <<: *default
  database: app_development
test:
  <<: *default
  database: app_test
production:
  <<: *default
  database: app_production

因为您使用 Heroku,所以您可以按原样离开生产部分

【讨论】:

但这不是不安全的吗?我不应该添加password: &lt;%= ENV['PASSWORD'] %&gt;吗?如果是,我应该如何“硬编码”我的密码?这是echo "export PASSWORD=fill_in_my_password" &gt;&gt; ~/.profile吗? 这是您的开发,即使您的数据必须是不敏感的。 ENV['PASSWORD'] 仅用于生产,但在你的情况下 Heroku 为你做,所以不用担心。 谢谢,我添加了,但现在收到错误消息PG::ConnectionBad: FATAL: Peer authentication failed for user "here_states_my_username" 这是另一个问题。 PG 在你的本地机器上吗?如果没有,那么您必须更改主机。看这里:***.com/questions/9987171/… 我添加了host: myurl.c9.io。现在运行rake db:migrate 超时,说明PG::ConnectionBad: could not connect to server: Connection timed out Is the server running on host "myurl.c9.io" (ip address) and accepting TCP/IP connections on port 5432? 我也做了另一个主题中建议的GRANT ALL ON DATABASE [dbname] to [usrname],但这没有任何区别。可能重要的是,当我运行 psql 时会显示 psql: FATAL: role "ubuntu" does not exist 而不是 psql: FATAL: role "your_username" does not exist,这在另一个主题中提到。

以上是关于尝试从 SQLite 切换到 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

Django:将项目从 sqlite 迁移到 PostgreSQL 的最佳实践是啥

如何从 SQLite 迁移到 PostgreSQL (Rails)

Django:将数据从 SQLite 移动到 PostgreSQL

将 Django 开发数据库从默认 SQLite 更改为 PostgreSQL

Django shift to PostgreSQL 无法导入fixture,说明数据太长

Django:从本地开发推送时,SQLite 在 Heroku 上覆盖 POSTGRESQL db