Как подключиться к базе данных postgres с помощью Sequel?

Я создавал веб-приложение для развертывания с помощью Heroku.com, когда понял, что единственный тип базы данных, который они поддерживают, — это PostgreSQL. До сих пор мое приложение (работающее на Ruby gem Sinatra) обращалось к базе данных через метод .Sqlite для Sequel gem.

Вот мой сценарий Ruby, когда я использовал Sequel для доступа к файлу .db через SQLite:

DB = Sequel.sqlite('mydatabase.db')
DB.create_table :mytable do
  primary_key :id
  String :column_name
end


Я установил PostgreSQL после того, как узнал, что Heroku использует только его. Вот сценарий через postgres (мое имя пользователя буквально «postgress», хотя я, очевидно, не буду раскрывать свой пароль в этом вопросе):

DB = Sequel.postgres('mydatabase.db',:user=>'postgres',:password=>'my_password_here',:host=>'localhost',:port=>5432,:max_connections=>10)
DB.create_table :mytable do
  primary_key :id
  String :column_name 
end

Однако, когда я запускаю этот код, я получаю следующую ошибку:

C:/Ruby193/lib/ruby/gems/1.9.1/gems/sequel-3.38.0/lib/sequel/adapters/postgres.rb:208:in 'initialize': PG::Error: FATAL: database "mydatabase.db" does not exist (Sequel::DatabaseConnectionError)

Я пробовал искать любую помощь в Google, StackOverflow, документах Sequel и справочных документах Heroku, но не нашел решения этой проблемы.

Кто-нибудь знает, что я делаю неправильно?


person Username    schedule 26.08.2012    source источник


Ответы (2)


База данных mydatabase.db не существует, согласно сообщению об ошибке от Pg. Вероятные причины:

  • Вероятно, вы имели в виду mydatabase без специфичного для SQLite суффикса имени файла .db.
  • Возможно, вы создали базу данных с другим регистром, например, "Mydatabase.db";
  • Возможно, вы подключаетесь к другому серверу Pg, чем вы думаете.
  • Вы никогда не создавали базу данных. В отличие от поведения SQLite по умолчанию, Pg не создает базы данных, когда вы пытаетесь подключиться к базе данных, которая еще не существует.

Если вы сомневаетесь, подключитесь к Pg с помощью psql и запустите \l, чтобы получить список баз данных, или подключитесь через PgAdmin-III.

документация и tutorial также настоятельно рекомендуется. Они хорошо написаны и научат вас многому об SQL в целом и о Pg в частности.

Кстати, пользователь postgres является суперпользователем. Вы не должны использовать его для своего приложения; это все равно, что запускать сервер от имени пользователя root, т.е. очень плохая идея. Создайте нового пользователя PostgreSQL без прав суперпользователя, createdb или createuser и используйте его для своего приложения. Вы можете CREATE DATABASE somedb WITH OWNER myappuser или, что предпочтительнее, создать базу данных, принадлежащую пользователю, отличному от вашего пользователя веб-приложения, а затем явным образом GRANT пользователю веб-приложения минимально необходимые разрешения. См. управление пользователями и GRANT.

person Craig Ringer    schedule 26.08.2012
comment
Не похоже, что удаление .db работает. Я хотел бы попробовать ваше второе решение, но я не уверен, что понимаю. Извините, я новичок в Postgres. Когда вы говорите подключиться к Pg с помощью psql, как мне это сделать? Спасибо за ваш ответ. - person Username; 27.08.2012
comment
Относительно psql см. postgresql.org/docs/9.1/static/tutorial- accessdb.html, postgresql.org/docs/9.1/ static/app-psql.html, devcenter.heroku.com/articles/ heroku-postgres-documentation и devcenter.heroku.com/articles/heroku- postgres-аддон . Графический интерфейс PgAdmin-III также подходит; после подключения вы получите список баз данных. Я не использую Heroku, но документы, которые мне понравились, должны объяснять, как подключиться. IIRC вы должны использовать SSL при подключении к Heroku извне. - person Craig Ringer; 27.08.2012
comment
О проблемах см. postgresql.org/docs /8.0/static/ для обсуждения учета регистра и цитирования. - person Craig Ringer; 27.08.2012
comment
Я использовал PgAdmin-III для подключения к локальному хосту: 5432, но не вижу там своей базы данных. Я вижу только базу данных под названием «postgres». Любая идея, как я получить его там? Что касается того, что вы сказали в том абзаце о суперпользователе Postgres, я вроде как понимаю, но не полностью. Я предполагаю, что я могу создать новых пользователей в графическом интерфейсе PgAdmin-III, создав новую роль входа, хотя я не уверен, что вы имели в виду, говоря, что пользователь «postgres» плохо подходит для тестирования приложений — хотя это в основном потому, что я м только сегодня влез в это. Еще раз, я ценю вашу помощь, особенно в воскресенье вечером. - person Username; 27.08.2012
comment
Э-э, вы действительно создали базу данных, к которой пытаетесь подключиться? postgresql.org/docs/current/static/sql-createdatabase.html< /а> . Для управления пользователями см. postgresql.org/docs/9.1/static/user. -manag.html. Кстати, у меня утро понедельника. Ответ обновлен. - person Craig Ringer; 27.08.2012
comment
Хм, я думаю, что нет. Что я хотел бы сделать, так это создать базу данных с помощью Sequel. Я думал, что код, который у меня был в моем вопросе, будет подходящим синтаксисом, но, похоже, это не так. - person Username; 27.08.2012
comment
@username Пользователь postgres как суперпользователь имеет полный контроль над всей системой базы данных. Он может удалять и создавать базы данных, типы данных, языки и т. д. Он может записывать файлы в каталог данных. Поскольку ваше приложение, очевидно, не должно работать под такой мощной учетной записью пользователя в производственной среде, вам действительно следует проводить тестирование с учетной записью с более низкими правами, чтобы не столкнуться с проблемами, когда ваше приложение работает при тестировании, но не в производственной среде. - person Craig Ringer; 27.08.2012
comment
@username Если этот инструмент Sequel не имеет специальных функций, специфичных для него (я не знаю и не использую его), вам нужно будет сделать это самостоятельно. Ваш код может подключиться к базе данных postgres и выполнить команду CREATE DATABASE mydatabase WITH OWNER myappuser;, а затем отключиться и снова подключиться к базе данных mydatabase. Сначала вам нужно вручную CREATE USER myappuser WITH CREATEDB PASSWORD 'xxxxx';. В качестве альтернативы вы можете подключиться в первый раз как пользователь postgres, и ваше приложение создаст собственную учетную запись пользователя перед созданием базы данных, и в этом случае вы можете удалить CREATEDB. - person Craig Ringer; 27.08.2012
comment
Спасибо за объяснение возможностей суперпользователя. Что касается Sequel, я могу поклясться, что с его помощью можно создавать базы данных Postgres. Если нет, я еще немного изучу то, что вы сказали. - person Username; 27.08.2012
comment
@username Насколько я могу судить по быстрому поиску документов, нет, но, возможно, что-то скрыто в битах, специфичных для db-драйвера. - person Craig Ringer; 27.08.2012
comment
Итак, я создал базу данных с помощью pgAdmin. Теперь все, что мне нужно сделать, это изучить некоторые его особенности, такие как правильный формат DateTime. Спасибо за помощь, Крейг Рингер. - person Username; 27.08.2012

На героку все, что вам нужно сделать, это указать Sequel подключиться к содержимому переменной среды DATABASE_URL (это правильно сформированный URL-адрес, который понимает Sequel):

DB = Sequel.connect(ENV['DATABASE_URL']) 
person hgmnz    schedule 29.08.2012
comment
Приемлем ли синтаксис Sequel.postgres(PARAMETERS_GO_HERE)? Мне удалось решить проблему, добавив базу данных PostgreSQL в мое приложение Heroku, получив ее информацию и изменив синтаксис подключения к PostgreSQL в сценарии Ruby, чтобы отразить информацию базы данных. - person Username; 30.08.2012
comment
Где хранится «DATABASE_URL»? - person nutella_eater; 16.09.2016
comment
@alexeypolusov heroku автоматически позаботится об этом при подготовке базы данных. Вот пример подготовки postgresql на героку: devcenter.heroku.com/ статьи/ - person BKSpurgeon; 02.01.2020