如何让我的 rails 应用程序使用我的 postgresql 数据库? [英] How do I get my rails app to use my postgresql db?
问题描述
我安装了 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屋!