Это самый надежный способ заставить ваше приложение rails работать с postgres в среде разработки в Ubuntu 13.10.
1) Создайте приложение rails с postgres YAML и гемом pg в Gemfile:
$ rails new my_application -d postgresql
2) Дайте ему некоторую функциональность CRUD.Если вы просто видите, работает ли postgres, создайте каркас:
$ rails g scaffold cats name:string age:integer colour:string
3) Начиная с rails 4.0.1
, опция -d postgresql
генерирует YAML, который не содержит параметр хоста. Я обнаружил, что мне это нужно. Отредактируйте раздел разработки и создайте следующие параметры:
encoding: UTF-8
host: localhost
database: my_application_development
username: thisismynewusername
password: thisismynewpassword
Обратите внимание, что параметр database
предназначен для базы данных, которая еще не завершается, иusername
и password
- учетные данные для несуществующей роли.Мы создадим их позже!
Вот как должен выглядеть config/database.yml
(не стыдно при копировании: D):
development:
adapter: postgresql
pool: 5
# these are our new parameters
encoding: UTF-8
database: my_application_development
host: localhost
username: thisismynewusername
password: thisismynewpassword
test:
# this won't work
adapter: postgresql
encoding: unicode
database: my_application_test
pool: 5
username: my_application
password:
production:
# this won't work
adapter: postgresql
encoding: unicode
database: my_application_production
pool: 5
username: my_application
password:
4) Запустите оболочку postgres с помощью этой команды:
$ psql
4a) Вы можете получить эту ошибку, если у вашего текущего пользователя (как у пользователя вашего компьютера) нет соответствующей роли администратора postgres.
psql: FATAL: role "your_username" does not exist
Теперь у меня естьтолько один раз установил postgres, поэтому я могу ошибаться, но я думаю, что postgres автоматически создает роль администратора с теми же учетными данными, что и пользователь, с которым вы установили postgres.
4b) Таким образом, это означает, что вам нужно перейти к пользователю, который установил postgres, чтобы использовать команду psql и запустить оболочку:
$ sudo su postgres
И затем запустить
$ psql
5) Вы будете знать, что находитесь в оболочке postgres, поскольку ваш терминал будет выглядеть следующим образом:
$ psql
psql (9.1.10)
Type "help" for help.
postgres=#
6) Используя синтаксис postgresql, давайте создадим пользователя, которого мы указали в config/database.yml
's development section:
postgres=# CREATE ROLE thisismynewusername WITH LOGIN PASSWORD 'thisismynewpassword';
Теперь, здесь есть некоторые тонкости, так что давайте рассмотрим их.
- Имя пользователя роли, thisismynewusername , не содержит кавычки любого вида
- Укажите ключевое слово LOGIN после С .Если вы этого не сделаете, роль все равно будет создана, но она не сможет войти в базу данных!
- Пароль роли, thisismynewpassword , должен быть в одномцитаты. Не двойные кавычки .
- Добавьте точку с запятой в конце;)
Вы должны увидеть это в своем терминале:
postgres=#
CREATE ROLE
postgres=#
Это означает "ROLE CREATED", но предупреждения postgres, похоже, принимают те же императивные соглашения git hub.
7) Теперь, все еще в оболочке postgres, нам нужно создать базу данных с именем, которое мыустановить в YAML.Сделайте пользователя, которого мы создали на шаге 6, своим владельцем:
postgres=# CREATE DATABASE my_application_development OWNER thisismynewusername;
Вы узнаете, добились ли вы успеха, потому что получите вывод:
CREATE DATABASE
8) Выйдите из postgresshell:
\q
9) Теперь момент истины:
$ RAILS_ENV=development rake db:migrate
Если вы получите это:
== CreateCats: migrating =================================================
-- create_table(:cats)
-> 0.0028s
== CreateCats: migrated (0.0028s) ========================================
Поздравляем,postgres отлично работает с вашим приложением.
9a) На моей локальной машине я получал ошибку разрешения.Я не могу вспомнить это точно, но это была ошибка в духе
Can't access the files. Change permissions to 666.
Хотя я бы посоветовал очень внимательно подумать о рекурсивной настройке привилегий записи на рабочей машине, локально я отдал всюпривилегии чтения и записи приложения:
9b) Поднимитесь на один уровень каталога:
$ cd ..
9c) Установите права доступа к каталогу my_application и всему его содержимому 666:
$ chmod -R 0666 my_application
9d) И снова запустите миграцию:
$ RAILS_ENV=development rake db:migrate
== CreateCats: migrating =================================================
-- create_table(:cats)
-> 0.0028s
== CreateCats: migrated (0.0028s) ========================================
Несколько советов и хитростей, если вы испортите
Попробуйте их перед повторным запуском всех этих шагов:
Пользователь mynewusername не имеет прав на CRUD для базы данных my_app_development
?Удалите базу данных и создайте ее снова с именем mynewuser в качестве владельца:
1) Запустите оболочку postgres:
$ psql
2) Удалите базу данных my_app_development
.Быть осторожен!Удаление означает полное удаление!
postgres=# DROP DATABASE my_app_development;
3) Создайте еще один my_app_development
и сделайте mynewusername его владельцем:
postgres=# CREATE DATABASE my_application_development OWNER mynewusername;
4) Выйти из оболочки:
postgres=# \q
Пользователь mynewusername
не может войти в базу данных? Кажется, вы написали неверный пароль в YAML и не можете вспомнить пароль, который вы ввели с помощью оболочки postgres? Просто измените роль с помощью пароля YAML:
1) Откройте свой YAML и скопируйте пароль в буфер обмена:
development:
adapter: postgresql
pool: 5
# these are our new parameters
encoding: UTF-8
database: my_application_development
host: localhost
username: thisismynewusername
password: musthavebeenverydrunkwheniwrotethis
2) Запустите оболочку postgres:
$ psql
3) Обновление пароля mynewusername
. Вставьте пароль и не забудьте заключить его в одинарные кавычки:
postgres=# ALTER ROLE mynewusername PASSWORD `musthavebeenverydrunkwheniwrotethis`;
4) Выйти из оболочки:
postgres=# \q
Пытаетесь подключиться к локальному хосту через средство просмотра базы данных, такое как Dbeaver, и не знаете, какой пароль у вашего пользователя postgres? Измените это так:
1) Запустите passwd
от имени суперпользователя:
$ sudo passwd postgres
2) Введите пароль вашей учетной записи для sudo
(ничего общего с postgres):
[sudo] password for starkers: myaccountpassword
3) Создайте новый пароль для учетной записи postgres:
Enter new UNIX password: databasesarefun
Retype new UNIX password: databasesarefun
passwd: password updated successfully
Получение этого сообщения об ошибке?:
Run `$ bin/rake db:create db:migrate` to create your database
$ rake db:create db:migrate
PG::InsufficientPrivilege: ERROR: permission denied to create database
4) Вам нужно дать своему пользователю возможность создавать базы данных. Из оболочки psql:
ALTER ROLE thisismynewusername WITH CREATEDB