如何使用Sequel连接到PostgreSQL数据库?

4
我是一个有用的助手,可以为您进行文本翻译。
我正在制作一款Web应用程序,计划使用Heroku.com进行部署,但我意识到他们唯一支持的数据库类型是PostgreSQL。到目前为止,我的应用程序(由Ruby gem Sinatra支持)通过Sequel gem的.Sqlite方法访问数据库。
以下是我使用Sequel访问.db文件的Ruby脚本:
DB = Sequel.sqlite('mydatabase.db')
DB.create_table :mytable do
  primary_key :id
  String :column_name
end


在了解Heroku只使用PostgreSQL之后,我安装了它。以下是通过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帮助文档中搜索任何帮助,但我没有找到解决这个问题的方法。
请问有谁知道我做错了什么?
2个回答

3

根据Pg的错误信息,数据库mydatabase.db不存在。可能的原因:

  • 你可能想要使用没有SQLite特定的.db文件名后缀的mydatabase
  • 可能你创建了大小写不同的数据库,例如"Mydatabase.db"
  • 你可能连接到了不同于你所认为的Pg服务器
  • 你从未创建过数据库。与SQLite默认行为不同,当你尝试连接到一个不存在的数据库时,Pg不会创建数据库。

如果有疑问,请使用psql连接Pg并运行\l列出数据库,或通过PgAdmin-III连接。

强烈推荐阅读PostgreSQL 文档教程。它们写得很好,并将教你许多关于SQL以及Pg的知识。

顺便提一下,postgres用户是超级用户。您不应该将其用于应用程序;这就像以root身份运行服务器一样,即一个非常糟糕的想法。创建一个没有超级用户、createdb或createuser权限的新PostgreSQL用户,并将其用于您的应用程序。您可以使用 CREATE DATABASE somedb WITH OWNER myappuser - 或者更好的方法是,由不同于您的webapp用户的用户拥有数据库,然后明确地GRANT webapp用户所需的最低权限。请参阅user managementGRANT


看起来去掉“.db”并没有起作用。我想尝试你的第二个解决方案,但我不确定是否理解正确。抱歉,我对Postgres还很陌生。当你说用psql连接到Pg时,我该如何操作?感谢你的回复。 - Username
关于大小写问题,请参见http://www.postgresql.org/docs/8.0/static/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS,了解大小写敏感性和引用的讨论。 - Craig Ringer
我用PgAdmin-III连接到localhost:5432,但是在那里我看不到我的数据库。我只看到一个叫做'postgres'的数据库。你有什么办法让它显示出来吗?至于你在那段关于Postgres超级用户的话,我有点明白,但还不完全清楚。我猜我可以通过在PgAdmin-III图形界面中创建一个新的登录角色来创建新用户,尽管我不确定你所说的'postgres'用户对于应用程序测试有何不利之处--虽然这主要是因为我刚刚开始接触这个。再次感谢你的帮助--尤其是在星期天晚上。 - Username
@username 除非这个 "Sequel" 工具有特定的特色 (我不知道或使用它),否则你需要自己完成这个任务。你的代码可以连接到 postgres 数据库并运行一个 CREATE DATABASE mydatabase WITH OWNER myappuser; 命令,然后断开连接并重新连接到数据库 mydatabase。你需要手动先创建用户 myappuser,命令为 CREATE USER myappuser WITH CREATEDB PASSWORD 'xxxxx';。另外,你可以首次连接时以 postgres 用户身份连接,并让你的应用程序在创建数据库之前创建自己的用户帐户,在这种情况下,你可以删除 CREATEDB - Craig Ringer
@username 就我快速搜索文档所见,似乎没有这样的功能,但也许在特定于数据库驱动程序的部分中隐藏着什么。 - Craig Ringer
显示剩余6条评论

1
在Heroku上,你只需要告诉Sequel连接到DATABASE_URL环境变量的内容(这是一个Sequel可以理解的正确格式的URL):
DB = Sequel.connect(ENV['DATABASE_URL']) 

“Sequel.postgres(PARAMETERS_GO_HERE)”这个语法正确吗?我已经通过将PostgreSQL数据库添加到我的Heroku应用程序中,获取其信息,并更改我的Ruby脚本的PostgreSQL连接语法以反映数据库的信息来解决了问题。 - Username
‘DATABASE_URL’ 存储在哪里? - nutella_eater
@alexeypolusov 当您在Heroku上提供数据库时,Heroku会自动处理这个问题。以下是在Heroku上提供PostgreSQL的示例:https://devcenter.heroku.com/articles/heroku-postgresql#provisioning-heroku-postgres - BenKoshy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接