返回
前端
分类

Ruby操作数据库方法全接触,今天就总结一下Mysql Front的用法吧

日期: 2020-03-31 02:08 浏览次数 : 89

这个假期安排得很紧,好多想做的事情都没做成。上学期用ruby做的课程设计本打算用这个假期总结下来,结果也没有实现,唉,残念……

这里有两篇文章,

1.安装Railsinstaller1.3.0

 

第一篇是说4中连接数据库的方法

Packages included are:

跟ruby阔别已久的感觉真的很不好受。这个假期一放假我就买了本《Ruby on Rails快速Web应用开发实战》,是一本国人写得被评价很不错的ruby教材。一直抽空翻一翻,不过并没有看太多。

第二篇详细说了底层原生连接mysql的方法,但是我完全没有配置就连接上了,可能是之前mysql、ruby、rails的环境已经装的很好了,linux和win7都可以执行。

  • Ruby 1.8.7-p352
  • Rails 3.0.7
  • Git 1.7.3.1
  • Sqlite 3.7.3
  • TinyTDS 0.4.5
  • SQL Server support 3.0.14
  • DevKit

 

安装成功可以使用ruby -v来查看版本号。另外这个地方的环境变量可配也可不配,没有影响。不过如果要是在命令行下面运行.rb文件的话,想要不在.rb前面加ruby就运行的话,需要设置.rb文件的默认打开方式为ruby即可。

为了把这本书看完,后面的ruby学习历程我打算参考这本书来写,一边看这本书,一边总结。

 

2.安装mysql-5.1.61,安装方法参看

 

 

安装完成后使用mysql –u root –p来检验是否安装成功。

这本书从一开始就推荐使用Mysql Front。在之前我没有使用这个,不过用过两天以后感觉确实很好用。今天就总结一下Mysql Front的用法吧。

Ruby操作数据库方法全接触

3.连接ruby与Mysql

 

各种形式的数据是当前信息社会的基石;而数据库则是保存、管理数据的最佳工具。一个现代编程语言,如果缺少操作数据库的支持,那么它的用途就会大打折扣。值得庆幸的是,我喜爱的Ruby语言,对数据库的支持是很完善的。今天,我就想和大家分享一下Ruby操作数据库的各种不同的方法。

方法一:

首先,按照上篇文章(很久以前写的了)把Mysql装上,之后安装Mysql Front。

通过编写对应数据库的驱动插件,目前Ruby支持大部分主流的关系型数据库系统,从开源的MySQL/Postgresql,到商业的DB2/Oracle,都有Ruby爱好者编写的对应驱动,并且在不断更新。所以,如果您想把Ruby用在以数据库为中心的信息系统中时,不需要有任何顾虑。

这一步是最麻烦的,也是最容易出问题的,在前面的日志中已经给出来ruby1.9.2与Mysql5.5的解决方案(使用新版本的同学,可以参考前面的日志)。

安装很简单,不必多说了。之后的操作如下:

从底层的基本操作到高级的抽象操作这个顺序,目前Ruby访问数据库的方法可分为4层,如下图所示:

安装MySQL gem

安装了MySQL之后,如果你的Ruby还没有mysql驱动支持(集成的Instant Rails中已经有了),你需要安装Ruby中对MySQL的驱动支持。

gem ``install mysql

这将安装2006/12/29日的mysql-2.7.3-mswin32.gem。需要注意的是,这个驱动是支持Ruby 1.8的,目前在Windows上还没有兼容1.9的gem出现(mysql-ruby-2.8x已经支持1.9了,但是并没有编译好的gem出现,需要自己编译——而整个编译会很痛苦)。

2008/8/21日发布了 mysql-2.8.1-mswin32.gem,这个版本支持Ruby 1.9了。

安装完成后,在irb下面调用require ‘mysql’报错:loaderror:no such file –mysql。然后需要到

 


Install
# ruby ./install.rb

此时报错会发生改变,为:

Client does not support authentication protocol requested by server; consider upgrading MySQL client。

请使用以下两种方法之一

其一:

mysql> SET PASSWORD FOR    -> 

'some_user'

@

必赢备用网址 ,'some_host'

 = OLD_PASSWORD(

'newpwd'

);

其二:

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd')    -> WHERE Host = 'some_host' AND User = 'some_user';mysql> FLUSH PRIVILEGES;

实例:mysql> SET PASSWORD FOR –

> root@localhost = OLD_PASSWORD('newpwd'); style="font-family: 微软雅黑;">这样配置之后运行没有问题了,不过不知道为什么输出的版本号却不是正确的,但是对数据库的操作没有问题,所以就没有再研究下去。并且这种配置也不会出现

方法二:

通过DBI连接数据库。

DBI模块的安装可以参照:http://www.cnblogs.com/huzhiwei/archive/2012/02/27/2369789.html

安装完成后可以使用irb命令require ‘dbi’来检查是否安装正确。我出现了以下问题:

问题1:gems/1.8/specifications/tilt-1.3.3.gemspec]: invalid date format in specification: "2011-08-25 00:00:00.000000000Z"

解决方案:

Search "spec" files in your Ruby directory: **C:Ruby187librubygems1.8specifications**

If a gemspec file contains something like this: s.date = %q{2011-10-13 00:00:00.000000000Z} Then delete the 00:00:00.000000000Z part: s.date = %q{2011-10-13}

After saving those gemspec files, the problem is solved.

问题2:rb:57: undefined method `deprecate' for DBI::Date:Class (NoMethodError)

解决方案:网上说是因为版本原因造成的,所以我按照晚上的方法安装了旧版本deprecated-2.0.1.gem,但是问题还是没有解决,于是我又安装了deprecated-3.0.0.gem,问题依然存在,不过我把deprecated-3.0.0.gem卸载掉问题就解决了。感觉这种解决方法很无语。

问题3:在执行dbh=DBI.connect("DBI:Mysql:my:localhost","root","password"),报错:dbi.rb:300:in `load_driver': Unable to load driver 'Mysql'

解决方案:从网上下载一个旧版本的libmySQL.dll,将其放到ruby的bin目录,还要执行gem install dbd-mysql。

下载地址:

也可从这里下载:

libmySQL

以上就是在配置过程中出现的问题,感觉这些开发软件配置起来问题就一大堆,这还是没有开发呢,让人很不爽啊,不过全解决了,还是值得庆幸的。

第一次启动Mysql Front的时候,会出现“添加对话”对话框,在“一般”选项卡中填入每次登录的名字,如:127.0.0.1   在连接选项卡的服务器位置输入:127.0.0.1 (本地IP地址)

| 4 - ActiveRecord ORM

切换到“注册”选项卡,用户名定为:”root”,密码为安装Mysql的时候的密码。

| 3 - DBI抽象层

确定之后,会弹出“打开对话”对话框。只是一步很简单的登陆步骤。如果数据库连接成功,会出现“对象浏览器”窗口。

| 2 - 对应数据库的Ruby驱动层(Ruby-Pr...)

 

| 1 - 数据库层(MySQL/Postgresql...)

最底层是数据库层,这层对应了各种不同的关系型数据库,比如MySQL/Oracle等。它上面的是驱动层,就是各数据库对应的Ruby驱动插件,这层的插件是数据库相关的,就是不同的数据库驱动插件也不同。然后在驱动层的基础上,我们就可以发展出DBI层(Database Interface)。在DBI这层,我们就可以编写独立于数据库的代码了。哈,这就是抽象的力量,也是我们软件开发者一直在追求的。不过当前的一个流行趋势是ORM,就是对象/关系型数据库表的映射,ActiveRecord就是一个 Ruby 的ORM组件,我们在下面可以看到它的一些应用。

现在,让我们一步步来体验一下Ruby操作数据库的快乐!我是在类Unix环境下(Linux/MacOSX都/BSD可以)操作的,数据库我选择了postgresql,因为我喜欢它的易用强大和宽松的BSD协议。您可以到 www.postgresql.com 下载最新的代码来编译、安装postgres数据库,这里不详细说明了。

假设我们把数据库安装在/usr/local/pgsql里面,用户名/密码为postgres/postgres。第一步,我们要安装postgres对应的Ruby驱动程序,您可以到 下载该驱动。我下载的是文件ruby-postgres-0.7.1.tar.gz(2003/01/06),然后1、解压缩:tar zxvf ruby-postgres-0.7.1.tar.gz
2、配置:
    cd ruby-postgres-0.7.1
    ruby extconf.rb --with-pgsql-include-dir=/usr/local/pgsql/include
                    --with-pgsql-lib-dir=/usr/local/pgsql/lib
注意:后面--with-pgsql-include-dir和--with-pgsql-lib-dir要根据您的postgres安装路径灵活修改。

3、编译:make
4、安装:sudo make install

安装上postgres的Ruby驱动之后,我们就可以用它来完成一些基本的对Postgresql数据库操作了。启动数据库postgres,建立一个测试数据库:createdb -E UNICODE testdb
然后我们往testdb数据库插入一个新表mytab,为简单起见,就2个字段:

[Copy to clipboard]

CODE:

create table mytab(
id         serial      not null,
msg        varchar(100),
primary key(id)
);

好了,准备好这些之后,就可以使用驱动来连接、操作了。在上面提到的下载驱动的站点,有一份简单的文稿,描述了该驱动支持的各种方法、函数。现在就让我们来完成一个简单的任务,就是往表mytab中插入一条数据,然后显示整个表的内容。这时直接使用postgres数据库驱动写的代码:

[Copy to clipboard]

CODE:

require 'postgres'

# 对应参数:主机名,端口号,连接参数,指定pgtty,数据库,用户名,密码
conn = PGconn.connect('localhost', 5432, '', '', 'testdb', 'postgres', 'postgres')
#    exec方法直接执行SQL语句,返回一个PGresult对象
conn.exec("insert into mytab(msg) values('I was inserted by driver.')")

# 取得表格数据,并分行打印
res = conn.exec('select * from mytab').result
for data in res
    p data
end

conn.close    # 关闭数据库连接

上面代码运行结果:

[Copy to clipboard]

CODE:

inity:~/tmp jellen$ ruby qd.rb
["1", "I was inserted by driver."]

直接面向数据库驱动的代码,虽然能完成工作,但是可移植性差,并且代码比较底层,不容易维护。要是换一个数据库,就需要重新编写大部分代码,这样不利于系统维护。于是人们便在数据库驱动的上面,抽象出DBI这样一个应用。就是只要变换几条数据库连接命令,就可以用相同的代码来操作各种不同的数据库,而且编程借口进一步统一、完善。这样,就大大减少了程序员为多个不同数据库编程的工作量,大大扩展了应用程序的可移植性。

要使用Ruby DBI,我们必须下载安装它,这个是Ruby DBI的官方站点:

您可以在上面下载到ruby-dbi的最新代码,我下的是dbi-0.1.1.tar.gz
接下来解压缩:tar zxvf dbi-0.1.1.tar.gz
转到目录:cd ruby-dbi
然后配置:
    ruby setup.rb config --with=dbi,dbd_pg
注:这个--with参数根据您的数据库类型选择(可以多个),这里仅选postgresql。
    ruby setup.rb setup
最后安装:sudo ruby setup.rb install

装上ruby-dbi之后,我们就可以使用它来操作数据库了。搜索网络,我们能找到一些ruby-dbi的资料,足够我们能够开始使用ruby-dbi来干活。下面的代码就是完成了和上面一样的任务,就往表格插一条数据,然后显示整个表格的内容:

[Copy to clipboard]

CODE:

require 'dbi'

# 根据不同的数据库,填不同的连接字符串,然后跟用户名、密码
dbh = DBI.connect('DBI:Pg:testdb', 'postgres', 'postgres')

# 可以使用sql替换,避免注入式攻击。
sql = 'insert into mytab(msg) values(?)'
dbh.do(sql, 'I was inserted by ruby-dbi.')

# dbi有完善的事务支持
sth = dbh.prepare('select * from mytab')
sth.execute
while row = sth.fetch
    p row
end
sth.finish

dbh.disconnect # 关闭数据库连接

从上面的代码可以看出,dbi层对数据库的操作更加抽象、高级,对各种工程中用到的技术支持也更完善。可以说,ruby-dbi是ruby直接操作数据库最好的方式,很适合在实际工程中使用。

最后我们要看的是ActiveRecord组件操作数据库的方法。ActiveRecord是著名的Ruby MVC框架Rails的一个组件,用来实现对象/关系型数据的映射,它在更高抽象层次上实现了操作数据库的各种方法,是一个简单好用的项目开发组件。由于Ruby拥有gems这个优秀的插件体系,我们可以单独使用ActiveRecord来操作数据库。由于ActiveRecord是 rails 的一个组件,所以如果您机器上已经安装了rails,那么ActiveRecord就不用另外安装了。不过单独安装它也很容易,只要在终端运行:
gem install activerecord
就可以了(前提是您已经安装了RubyGems)。

在ActiveRecord中,数据库的一个表格代表程序中的一个类对象,表格中的每个字段分别对应了类中的一个属性。对数据库的操作转化到程序中程序员熟悉的代码模式;我们可以不用涉及具体的SQL语句,就可以对数据库进行增、删、改等操作了。这样一来,我们可以在更高的抽象层次上来进行业务操作,完全屏蔽了丑陋的SQL语句,抽象万岁!

ActiveRecord有一个自成体系的操作模式,比如数据表格和类的命名、对应方式,是复数的表名对应单数的类名,如果一个表格名字为students,那么和它对应的类名就是Student。这些规定对刚接触Rails的人可以感觉不习惯,但是习惯之后就会发觉其实也是很方便的,至少我们不用为代码中各种变量、类的命名伤脑筋了。然后ActiveRecord有很多内建的方法,具体请参考相关书籍。现在,让我们来用ActiveRecord来完成我们上面规定的任务,不多解释,请看代码:

[Copy to clipboard]

CODE:

require 'rubygems'
require_gem 'activerecord'    # 请注意使用rubygems时候的声明方式

# 连接数据库,按需求填写各种参数。
ActiveRecord::Base.establish_connection(:adapter => "postgresql",
    :host => "localhost", :database => "testdb")
class Mytab < ActiveRecord::Base # 开始ORM对应
    set_table_name 'mytab' # 指定数据库名
end

# 插入一条数据
tab = Mytab.new
tab.msg = 'I was inserted by ActiveRecord.'
tab.save

# 显示所有数据
data = Mytab.find(:all)
data.each { |line| puts "['#{line[:id]}', '#{line[:msg]}']" }

感叹于程序员对抽象孜孜不倦的追求,查看上面的代码,我们没有看到任何具体的SQL语句,全部预定对数据库的操作,都在常规的类对象操作之间完成。为了验证我们的整个操作过程,我们可以到postgresql的交互命令行终端:psql -U postgres testdb

[Copy to clipboard]

CODE:

testdb=# select * from mytab;
id |                 msg               
----+---------------------------------
    1 | I was inserted by driver.
    2 | I was inserted by ruby-dbi.
    3 | I was inserted by ActiveRecord.
(3 rows

哈哈,所有数据都已经正确入库!到此为止,我们一起体验了Ruby语言操作数据的不同方法。没一种操作数据库的方法都有自己的优点和缺点,在实际工作中,大家应该按照具体情况选择适合自己的方法。本文只是起个抛砖引玉的作用,要详细了解每个方法具体的内容,请参考相关文档。感谢世界各地的开源爱好者,让我们拥有Ruby这样好用的编程语言,然后还要感谢他们无私分享的编程经验,能够让我完成这篇浅显的文章:)

祝大家Ruby之旅开心愉快!

 

 

 

 

 

 

 

 

 

 

安装环境:

OS:Windows XP

Ruby: Ruby1.9.1

Mysql: Mysql5.1.46 (username/password: root/root  port:3306)

Ruby-Mysql Driver: mysql-2.8.1-x86-mswin32.gem

(注:用2.7.3版本的驱动在测试时会出现 require"mysql",找不到指定模块 错误)

IDE:RubyMine2.0.1

 

安装Ruby,RubyMine,Mysql的事项在这里就不多说了,提一下安装驱动的步骤

1)在Mysql安装目录的 bin 目录下,找到 ibmySQL.dll ,将该文件复制到 Ruby 安装目录的 bin 目录中

2),下载 mysql-2.8.1-x86-mswin32.gem,这是 mysql_Ruby驱动程序。

       命令行,进入该文件所在目录,运行 gem install mysql-2.8.1-x86-mswin32.gem ,安装成功即可。

 

      必赢备用网址 1

 

 

创建Ruby测试类

MysqlTest.rb

 

 

 

 

class MysqlTest
  #Code here
  require "mysql"
  def testMysql
    dbc=Mysql.real_connect('localhost','root','1234','mysql')
    res=dbc.query('select * from user')
    puts "Test Mysql...."
    while row=res.fetch_row do
      puts "#{row[0]}"
    end
  end
  def createTable
      dbc=Mysql.real_connect('localhost','root','1234','test')
      dbc.query("drop table if exists cux_users")
      dbc.query("create table cux_users(id int,name char(20))")
      dbc.query("insert into cux_users values(1,'Tom')")
      printf "Create Table........"
      printf "%d rows were inserted/n",dbc.affected_rows
      res = dbc.query("SELECT name FROM cux_users")
      puts "===Select Data===/n"
      while row = res.fetch_row do
      printf "%s, %s/n", row[0], row[1]
      end
      puts "==================/n"
      puts "Server version: " + dbc.get_server_info
     rescue Mysql::Error => e
     puts "Error code: #{e.errno}"
     puts "Error message: #{e.error}"
     puts "Error SQLSTATE: #{e.sqlstate}" if e.respond_to?("sqlstate")
    ensure
      puts "Close Connection......."
      dbc.close if dbc
  end
  (MysqlTest.new).testMysql
  (MysqlTest.new).createTable
end

 

测试结果:

C:/Ruby19/bin/ruby.exe -e STDOUT.sync=true;STDERR.sync=true;load($0=ARGV.shift) E:/Ruby/Test/com.crystal/mysql_test.rb
Test Mysql....
localhost
Create Table........1 rows were inserted
===Select Data===

这就是Mysql Front的配置,很简单吧?

Tom, 

Server version: 5.1.46-community
Close Connection.......

Process finished with exit code 0

 

查看数据库test

 

必赢备用网址 2

 

 

 

下篇我们会谈一谈如何将Mysql连接到Ruby语言中去。

先到这里,各位晚安!