如何让我的 rails 应用程序使用我的 postgresql 数据库? [英] How do I get my rails app to use my postgresql db?

查看:31
本文介绍了如何让我的 rails 应用程序使用我的 postgresql 数据库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我安装了 prostgres 以与我的 rails4 应用程序一起使用,并且我能够连接到数据库服务器并创建数据库.然后我对 Gemfile 和 config/database.yml 进行了必要的更改以使用 postgres.然后我创建了一个新应用,并在应用中创建了一个 User 模型:

I installed prostgres to use with my rails4 app, and I am able to connect to the database server and create databases. Then I made the necessary changes to my Gemfile and config/database.yml to use postgres. Then I created a new app, and in the app I created a User model:

$ rails generate model User name:string email:string
      invoke  active_record
      create    db/migrate/20130806145935_create_users.rb
      create    app/models/user.rb
      invoke    rspec
      create      spec/models/user_spec.rb

然后我做到了:

$ bundle exec rake db:migrate
==  CreateUsers: migrating ====================================================
-- create_table(:users)
   -> 0.1498s
==  CreateUsers: migrated (0.1500s) ===========================================

但是在db目录下,我看到了这些文件:

But in the db directory, I see these files:

development.sqlite3
test.sqlite3

此外,当我尝试使用 SQLite 数据库浏览器查看这些文件时,我收到一条错误消息,指出它们不是 sqlite 3 数据库.事实上,它们是空的:

Furthermore, when I try to look at those files with the SQLite Database Browser, I get an error that says they are not sqlite 3 databases. In fact, they are empty:

~/rails_projects/sample_app4_0/db$ ls -al
total 40
drwxr-xr-x   8 7stud  staff    272 Aug  6 22:50 .
drwxr-xr-x  24 7stud  staff    816 Aug  6 22:23 ..
-rw-r--r--   1 7stud  staff      0 Jul 30 00:21 development.sqlite3
drwxr-xr-x   3 7stud  staff    102 Aug  6 22:22 migrate
-rw-r--r--   1 7stud  staff   1063 Aug  6 09:06 schema.rb
-rw-r--r--   1 7stud  staff    343 Jul 29 20:01 seeds.rb
-rw-r--r--   1 7stud  staff      0 Jul 30 03:02 test.sqlite3

我读到您可以创建带有标志的 rails 应用程序,该标志告诉它使用 postgres:

I read that you can create your rails app with a flag that tells it to use postgres:

rails new myapp --database postgresql

但我已经创建了我的应用程序.我必须重新开始吗?如果这有所作为,我将使用 git.

but I already created my app. Do I have to start over? I'm using git if that makes a difference.

我的 Gemfile:

My Gemfile:

source 'https://rubygems.org'
ruby '2.0.0'
#ruby-gemset=railstutorial_rails_4_0

gem 'rails', '4.0.0'
gem 'bootstrap-sass', '2.3.2.0'
#Added for postgres:
gem 'pg', '0.15.1'


group :development, :test do
  #gem 'sqlite3', '1.3.7'
  gem 'rspec-rails', '2.13.1'
  gem 'guard-rspec', '2.5.0'

  gem 'spork-rails', github: 'sporkrb/spork-rails'
  gem 'guard-spork', '1.5.0'
  gem 'childprocess', '0.3.6'
end

group :test do
  gem 'selenium-webdriver', '2.0.0'
  gem 'capybara', '2.1.0'
  gem 'growl', '1.0.3'
end

gem 'sass-rails', '4.0.0'
gem 'uglifier', '2.1.1'
gem 'coffee-rails', '4.0.0'
gem 'jquery-rails', '2.2.1'
gem 'turbolinks', '1.1.1'
gem 'jbuilder', '1.0.2'

group :doc do
  gem 'sdoc', '0.3.20', require: false
end

group :production do
  #gem 'pg', '0.15.1'
  gem 'rails_12factor', '0.0.2'
end

config/database.yml:

config/database.yml:

development:
  adapter: postgresql
  encoding: utf8
  database: sampleapp_dev  #can be anything unique

  pool: 5
  timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.

test:
  adapter: postgresql
  encoding: utf8
  database: sampleapp_test  #can be anything unique

  pool: 5
  timeout: 5000

production:
  adapter: postgresql
  database: sampleapp_prod 

  pool: 5
  timeout: 5000

推荐答案

好的,为了弄清楚发生了什么,我使用 --database 标志创建了一个新的测试应用程序:

Okay, to figure out what's going on I created a new test app using the --database flag:

rails_projects$ rails new test_postgres --database postgresql

事实证明,所做的只是像这样设置您的 config/database.yml 文件:

It turns out, all that does is set up your config/database.yml file like this:

development:
  adapter: postgresql
  encoding: unicode
  database: test_postgres_development
  pool: 5
  username: test_postgres
  password:

test:
  adapter: postgresql
  encoding: unicode
  database: test_postgres_test
  pool: 5
  username: test_postgres
  password:

production:
  adapter: postgresql
  encoding: unicode
  database: test_postgres_production
  pool: 5
  username: test_postgres
  password:

还有空的 sqlite 文件:

And the empty sqlite files:

development.sqlite3
test.sqlite3 

仍然存在于 db 目录中.

were still present in the db directory.

然后我启动了postgres,我用pgAdmin3连接了postgres数据库服务器.(如果这令人困惑,请参阅:如何在 Mac OSX 10.6.8 上启动 enterpiseDB PostgreSQL?)

Then I started up postgres, and I used pgAdmin3 to connect to the postgres database server. (If that is confusing, see: How do I start enterpiseDB PostgreSQL on Mac OSX 10.6.8?)

然后我创建了一个模型:

Then I created a model:

~/rails_projects$ cd test_postgres/
~/rails_projects/test_postgres$ rails g scaffold Post title:string author:string body:text

      invoke  active_record
      create    db/migrate/20130807061320_create_posts.rb
      create    app/models/post.rb
      invoke    test_unit
      create      test/models/post_test.rb
      create      test/fixtures/posts.yml
      invoke  resource_route
       route    resources :posts
      invoke  scaffold_controller
      create    app/controllers/posts_controller.rb
      invoke    erb
      create      app/views/posts
      create      app/views/posts/index.html.erb
      create      app/views/posts/edit.html.erb
      create      app/views/posts/show.html.erb
      create      app/views/posts/new.html.erb
      create      app/views/posts/_form.html.erb
      invoke    test_unit
      create      test/controllers/posts_controller_test.rb
      invoke    helper
      create      app/helpers/posts_helper.rb
      invoke      test_unit
      create        test/helpers/posts_helper_test.rb
      invoke    jbuilder
      create      app/views/posts/index.json.jbuilder
      create      app/views/posts/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/posts.js.coffee
      invoke    scss
      create      app/assets/stylesheets/posts.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

然后我尝试执行迁移:

~/rails_projects/test_postgres$ bundle exec rake db:migrate
rake aborted!
FATAL:  role "test_postgres" does not exist
...
...

发生该错误是因为我没有名为 test_postgres 的数据库用户(或在 postgres 中的角色)——而且很可能没有其他人也有.当我设置 postgres 时,我创建了用户 7stud,这是我的 Mac 用户名.为了修复这个 rails 错误,我只是在 config/database.yml 的三行上将用户名更改为 7stud.事实上,我什至不需要这样做.因为我是 Mac 上的 7stud 用户,这意味着我以 7stud 的身份执行我的 rails 命令,再加上我的 postgres db 是使用名为 7stud 的用户设置的,这使我可以完全消除 config/中的用户名行数据库.yml:

That error occured because I don't have a database user(or role in postgres speak) named test_postgres--and it's likely no one else will either. When I set up postgres, I created the user 7stud, which is my Mac user name. To fix that rails error, I just changed the username to 7stud on the three lines in config/database.yml. in fact, I didn't even need to do that. Because I am the user 7stud on my Mac, that means I am executing my rails commands as 7stud, and coupled with the fact that my postgres db was setup with a user named 7stud, that allows me to completely eliminate the username line in config/database.yml:

development:
  adapter: postgresql
  encoding: unicode
  database: test_postgres_development
  pool: 5

test:
  adapter: postgresql
  encoding: unicode
  database: test_postgres_test
  pool: 5

production:
  adapter: postgresql
  encoding: unicode
  database: test_postgres_production
  pool: 5

然后我再次尝试执行迁移:

Then I tried executing the migration again:

~/rails_projects/test_postgres$ bundle exec rake db:migrate
rake aborted!
FATAL:  database "test_postgres_development" does not exist
...
...

请注意,database.yml 文件指定了三个数据库名称.所以我创建了开发和测试数据库:

Notice that the database.yml file specifies three database names. So I created the development and test databases:

~$ cd /Library/PostgreSQL/9.2/
/Library/PostgreSQL/9.2$ sudo su postgres
Password: <normal sudo password>
bash-3.2$ createdb -O7stud -Eutf8 test_postgres_development
bash-3.2$ createdb -O7stud -Eutf8 test_postgres_test

-O 所有者
-E 编码

-O owner
-E encoding

然后我再次尝试执行迁移:

Then I tried executing the migration again:

~/rails_projects/test_postgres$ bundle exec rake db:migrate
==  CreatePosts: migrating ====================================================
-- create_table(:posts)
   -> 0.0441s
==  CreatePosts: migrated (0.0443s) ===========================================

成功(但网络上的其他地方的示例显示了带有通知"行的不同输出).

Success (but elsewhere on the net examples show different output with 'Notice' lines).

然后我启动了一个服务器:

Then I started a server:

~/rails_projects/test_postgres$ rails s

...在我的浏览器中,我输入了网址:

...and in my browser I entered the url:

http://localhost:3000/posts

...然后我创建了几个帖子.

...and I created a couple of Posts.

然后使用pgAdmin3,我尝试在test_postgres_development 数据库中查找帖子.首先,我通过右键单击行并选择刷新"来刷新 pgAdmin3 中的数据库(3)"行.然后我在 test_postgres_development 目录中搜索了很长时间,没有运气.在 Schemas 下,我可以看到一个包含 posts 目录的 Tables 目录,因此该表已创建,但我不知道如何查看表中是否有任何条目.事实证明,您必须右键单击帖子目录,然后选择查看数据",瞧,那里是我创建的帖子.

Then using pgAdmin3, I tried to find the posts in the test_postgres_development database. First, I refreshed the 'Databases(3)' line in pgAdmin3 by right clicking on the line and choosing 'Refresh'. Then I searched through the test_postgres_development directory for a long time, with no luck. Under Schemas, I could see a Tables directory that contained a posts directory, so the table got created, but I couldn't figure out how to see if there were any entries in the table. It turns out, you have to right click on the posts directory, then select 'View Data', and voila there were the posts I created.

或者您可以使用命令行查看条目:

Or you can view the entries using the command line:

~$ cd /Library/PostgreSQL/9.2/
/Library/PostgreSQL/9.2$ sudo su postgres
Password: <normal sudo password>
bash-3.2$ psql -U 7stud test_postgres_development
psql (9.2.4)
Type "help" for help.

test_postgres_development=> dt

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | posts             | table | 7stud
 public | schema_migrations | table | 7stud
(2 rows)

test_postgres_development=> d posts

                                     Table "public.posts"
   Column   |            Type             |                     Modifiers                      
------------+-----------------------------+----------------------------------------------------
 id         | integer                     | not null default nextval('posts_id_seq'::regclass)
 title      | character varying(255)      | 
 author     | character varying(255)      | 
 body       | text                        | 
 created_at | timestamp without time zone | 
 updated_at | timestamp without time zone | 
Indexes:
    "posts_pkey" PRIMARY KEY, btree (id)


test_postgres_development=> select id, title, author, created_at from posts;


 id |         title          |    author    |         created_at         
----+------------------------+--------------+----------------------------
  1 | Hi there.              | Tom          | 2013-08-07 06:24:57.806237
  2 | Ola!                   | Nancy        | 2013-08-07 06:25:23.989643
(2 rows)

test_postgres_development=> 

这篇关于如何让我的 rails 应用程序使用我的 postgresql 数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆