您所在的位置: 首页>>读书频道>>设计开发>>其它开发>>

10.4.3 连接到PostgreSQL

http://book.51cto.com  2007-11-15 17:09  [美] Hal Fulton著 陈秋萍等译  人民邮电出版社  我要评论(0)

10.4.3  连接到PostgreSQL

RAA提供了一个扩展,可用于访问PostgreSQL(支持PostgreSQL 6.5/7.0)。

假如已安装和配置好PostgreSQL(并创建了一个名为testdb的表),则只需遵循在Ruby中使用其他数据库接口的步骤:加载模块,连接数据库,然后处理表。可能需要执行查询、获取选定的结果以及处理事务。

require 'postgres'
conn = PGconn.connect("",5432, "", "", "testdb")

conn.exec("create table rtest ( number integer default 0 );")
conn.exec("insert into rtest values ( 99 )")
res = conn.query("select * from rtest")
# res id [["99"]]

PGconn类包含connect方法,该方法接受典型的数据库连接参数,如主机、端口、数据库、用户名和登录密码,但它还通过第三和第四参数接受选项和tty参数。在上面的例子中,已经以特权用户的身份连接到了UNIX套接字,因此不需要用户名和密码,且主机、选项和tty都为空。端口必须为整数,其他参数都是字符串。它的一个别名是方法new。

接下来需要处理表,这需要采取某种方式执行查询,为此可使用实例方法PGconn#exec和PGconn#query。

exec方法将其字符串参数作为SQL查询请求发送给PostgreSQL,如果成功则返回一个PGresult实例,否则引发PGError异常。

query方法也将其字符串参数作为SQL查询请求发送给PostgreSQL。然而,它在成功时返回一个数组。返回的数组实际上是个元组数组。如果失败,它返回nil,而错误细节可以通过调用方法error获取。

有个特殊方法可用于将值插入到指定表中,这就是insert_table。虽然名为insert_table,但它的实际意思是“插入到表中”(insert into table)。该方法返回一个PGconn对象。

conn.insert_table("rtest",[[34]])
res = conn.query("select * from rtest")
# res is [["99"], ["34"]]

上述代码将一行值插入到rtest表中。在这个简单的例子中,表开始只有一列。注意,PGResult对象res表明,更新后的结果包含两个元组。PGresult的方法将稍后讨论。

在PGconn类中,其他可能很有用的方法包括:

• db:返回连接的数据库名。
• host:返回连接的服务器名。
• user:返回通过认证的用户名。
• error:返回有关连接的错误消息。
• finish、close:关闭后端连接。
• loimport(file):将文件导入到大型对象中。如果成功,返回PGlarge实例;如果失败,则引发PGError异常。
• loexport(oid, file):将大型对象oid保存到文件中。
• locreate([mode]):如果成功则返回PGlarge实例,如果失败将引发PGError异常。
• loopen(oid, [mode]):打开大型对象oid,如果成功则返回PGlarge实例。mode参数指定打开大型对象的模式,取值为INV_READ或INV_WRITE(如果省略,默认为INV_READ)。
• lounlink(oid):将Postgres大型对象oid解除链接(删除)。

注意,最后5个方法(loimport、loexport、locreate、loopen和lounlink)涉及PGlarge类的对象。PGlarge类有专用于访问和修改其对象的方法(这些对象是PGconn的实例方法loimport、locreate和loopen等创建的)。

下面是PGlarge的方法:

• open([mode]):打开一个大型对象,mode参数指定模式(与前面介绍的PGconn#loopen相同)。
• close:关闭大型对象(当成无用单元被收集时也将关闭)。
• read([length]):从大型对象中读取length个字节,如果没有指定length,则读取所有数据。
• write(str):将字符串写入大型对象,并返回写入的字节数。
• tell:返回指针的当前位置。
• seek(offset, whence):将指针移到offset指定的位置,参数whence的可能取值为SEEK_SET、SEEK_CUR或SEEK_END(0、1、2)。
• unlink:删除大型对象。
• oid:返回大型对象的oid。
• size:返回大型对象的大小。
• export(file):将大型对象oid保存到文件中。
我们最感兴趣的是PGresult的实例方法(如下面的列表所示),PGresult对象是由查询创建的(使用完这些对象后,使用PGresult#clear释放它们占用的内容)。
• result:返回数组中的查询结果元组。
• each:迭代器。
•  []:存取器。
• fields:返回由查询结果中的字段组成的数组。
• num_tuples:返回查询结果中的元组数。
• fieldnum(name):返回命名字段的索引。
• type(index):返回与字段类型对应的整数。
• size(index):返回字段的大小,以字节为单位;–1表示字段的长度可变。
• getvalue(tup_num, field_num):返回参数指定的字段的值,其中tup_num相当于行号。
• getlength(tup_num, field_num):返回字段长度,单位为字节。
• cmdstatus:返回最后一条查询命令的状态字符串。
• clear:删除PGresult对象。

【责任编辑:雪花 TEL:(010)68476606】

回书目   上一节   下一节
Ruby实用开发手册
Java编程开发手册
深入Vista应用程序开发
Ruby on Rails 社区网站开发
ASP.NET从入门到精通
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有