Ruby PostgreSQL教程

15

我正在尝试编写一个与PostgreSQL数据库交互的Ruby脚本。虽然我正在从文档中拼凑如何实现这一点,但是一个好的教程或示例代码将大大缩短获取此功能所需的时间。如果有人有链接、提示或可分享的代码,我将不胜感激。

编辑,使这个注释更清晰:

注意:这与Rails ActiveRecord无关,我正在编写一个Ruby脚本,它将参与一个与Rails完全独立的程序。


嗯,我认为每个人都有点困惑。我正在尝试在自己的项目中使用 ActiveRecord,而不是在 Rails 中使用。但是,如果有关于在 Ruby 中连接数据库的任何信息,我会很高兴看到,因为我经常发现有更好的实现方式。这也将成为未来读者的好资源。 - providence
你可以单独使用ActiveRecord而不依赖Rails,或者选择另一个ORM(如Sequel或DataMapper)。我更喜欢Sequel;我建议使用ORM而不是手写特定DBM的SQL。如果将来需要切换到其他数据库管理器,则使用ORM是轻松的,只要它支持即可。 - the Tin Man
4个回答

21
请具体说明你正在使用哪个postgresql库。
我假设你在使用'pg' gem库,除了ActiveRecord之外。
该项目源代码中有一个HTML文件可能会对你有所帮助。请前往https://bitbucket.org/ged/ruby-pg/src/b477174160c8/doc/postgres.html,然后在html的右上方点击“raw”。用你的浏览器打开文件。
以下示例代码可帮助您连接数据库(从html文件复制):
require "postgres"
conn = PGconn.connect("localhost", 5432, "", "", "test1")
# or: conn = PGconn.open('dbname=test1')
res = conn.exec("select * from a;")

res对象是PGResult。向下滚动到HTML中的该部分以查看可以调用哪些方法。

此链接具有PGResult示例:http://rubydoc.info/gems/pg/0.10.0/PGresult

摘录:

require 'pg'
conn = PGconn.open(:dbname => 'test')
res  = conn.exec('SELECT 1 AS a, 2 AS b, NULL AS c')
res.getvalue(0,0) # '1'
res[0]['b']       # '2'
res[0]['c']       # nil

3
顺便提一句,那个 html 文件可能已经过时了。我认为你需要将其更改为要求 'pg' 而不是 'postgres'。 - Kelvin
为什么 Ruby 和 PostgreSQL 经常一起使用?这样做的原因是什么? - dragonfly02
如果你问为什么Ruby应用程序经常与PostgreSQL一起使用,那只是因为应用程序开发人员选择这样做。我也不确定说Ruby开发人员更经常使用PostgreSQL而不是MySQL(例如)。如果这不是你的意思,请重新表达问题。 - Kelvin
这就是我的意思,但我不能重新表达它,因为不允许再编辑评论了。不过我确实看到很多公司同时使用Ruby和PostgreSQL。 - dragonfly02

17

我确认,“postgres”包已经过时,你需要使用“pg”。

花费了我很多时间才能让ruby和postgres完成基本的select * from films操作。作为一个友好的人,这是我的代码:

postgres准备(数据库=megatest 用户=roger 密码=123456 表=films)

$ su postgres 
psql 
CREATE USER roger WITH PASSWORD '123456';

GRANT ALL PRIVILEGES ON DATABASE megatest to roger;

megatest=# GRANT SELECT ON films TO PUBLIC;

PG包的准备工作

sudo gem install pg

Ruby代码

require 'pg'

conn=PGconn.connect( :hostaddr=>"127.0.0.1", :port=>5432, :dbname=>"megatest", :user=>"roger", :password=>'123456')
# or for a non IP address :host => 'my.host.name.com' instead of hostaddr

# run the query
res = conn.exec("SELECT * FROM films")

# Ran only once in order to get field Name
fieldArray=res.fields()
fieldArray.each do |elem|
    print "elem="+elem+"\n"
end

# print data from the query
res.each{ |row|
    puts "Code="+row["code"]  +" title="+row["title"] +" did="+row["did"] +" date_prod="+row["date_prod"] +" kind="+row["kind"] +" len="+row["len"]
}

结果

root@eblain-VirtualBox:/home/eblain/ruby# ruby postgresTest.rb
Code=UA502 title=Bananas did=105 date_prod=1971-07-13 kind=Comedy len=01:22:00
Code=UA503 title=Cowboy did=105 date_prod=1979-07-13 kind=Horror len=01:32:00
Code=UA544 title=YoBro did=105 date_prod=1981-07-13 kind=Action len=01:42:00

1
很难理解你的回答。你能否修复格式,使其更易用? - the Tin Man
在Mac上安装本地PostgreSQL,主机名是什么? - HMLDude

4
您只需要使用pg gem并建立与数据库的连接:
require 'pg'
# require 'active_record'  # uncomment for not Rails environment

ActiveRecord::Base.establish_connection(:adapter => "postgresql",
                                        :username => "username",
                                        :password => "password",
                                        :database => "database")

当你定义模型继承自ActiveRecord::Base时,它们将使用此数据库连接。其他功能应该与Rails中的工作方式相同。


11
为什么这个答案被标记为已接受?它并没有回答你的问题,你指出它没有涉及Rails或ActiveRecord。 - broschb
他正在编写一个简单的 Ruby 脚本,他不想导入整个无关的框架 :/ - Martin Konecny
Active Record非常适合处理数据库连接。如果您想要更轻量级的东西,也可以使用Sequel gem。当时我只知道AR,因此我推荐使用它。 - Ryan Bigg
当我尝试这个解决方案时,出现了以下错误: 指定了“postgresql”作为数据库适配器,但是宝石(gem)没有被加载。请在Gemfile中添加“gem'pg'”。 - RoRFan

4

对于参数化的SQL语句,您应该使用PGconn#exec_params,例如:

conn = PGconn.new(:dbname => 'test')
conn.exec_params(
    'INSERT INTO comedians (first_name, last_name) VALUES ($1, $2)',
    ['Louis', 'CK'])
conn.close

来源:http://deveiate.org/code/pg/PGconn.html

点击此处查看可以传递给PGconn构造函数的完整参数列表。


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