繁体   English   中英

使用ActiveRecord连接到SQL Server

[英]Connecting to SQL Server with ActiveRecord

您是否曾经使用ActiveRecord连接到SQL Server? 这可能吗? 任何人都可以提供一些起点吗?

这是我用过的:

从这里: http//github.com/rails-sqlserver/2000-2005-adapter/tree/master

安装

首先,您需要Ruby DBI和Ruby ODBC。 据我所知,不再支持ADO DBD for DBI。 下面的安装不是全面了解如何安装和/或配置FreeTDS等所有必需的移动部件。 它还将假定依赖库和适配器本身的gem安装。

应该注意的是,这个版本的适配器是使用古老的0.0.23版本的DBI开发的,直到0.4.0的当前稳定版本。 因为更高版本的DBI将会改变很多东西,所以我们强烈建议您将安装最大化到版本0.4.0,以下示例显示。 目前我们不支持高于0.4.0的DBI版本。 好消息是,如果你使用一个非常旧的DBI与ADO,从技术上讲,这个适配器仍然可以为你工作,但要警告你的路径变老,可能不会长期支持。

$ gem install dbi --version 0.4.0
$ gem install dbd-odbc --version 0.2.4
$ gem install rails-sqlserver-2000-2005-adapter -s http://gems.github.com

从这里: http//lambie.org/2008/02/28/connecting-to-an-mssql-database-from-ruby-on-ubuntu/

首先,更新〜/ .profile以包含以下内容:

export ODBCINI=/etc/odbc.ini
export ODBCSYSINI=/etc
export FREETDSCONF=/etc/freetds/freetds.conf

然后重新加载.profile,再次注销。

其次,在Ubuntu 7.10服务器上我需要安装一些软件包。

mlambie@ubuntu:~$ sudo aptitude install unixodbc unixodbc-dev freetds-dev sqsh tdsodbc 

安装FreeTDS后,我可以这样配置:

mlambie@ubuntu:/etc/freetds$ cat freetds.conf
[ACUMENSERVER]
  host = 192.168.0.10
  port = 1433
  tds version = 7.0

这里重要的是ACUMENSERVER,它是我在连接数据库时使用的DSN。 主机和端口是不言自明的,值得注意的是我必须特别使用7.0作为tds版本。

测试FreeTDS并不太难:

mlambie@ubuntu:~$ sqsh -S ACUMENSERVER -U username -P password
sqsh: Symbol `_XmStrings' has different size in shared object, consider re-linking
sqsh-2.1 Copyright (C) 1995-2001 Scott C. Gray
This is free software with ABSOLUTELY NO WARRANTY
For more information type '\warranty'
1> use acumen
2> go
1> select top 1 firstname, lastname from tblClients
2> go

[record returned]

(1 row affected)
1> quit

接下来需要配置ODBC:

mlambie@ubuntu:/etc$ cat odbcinst.ini
[FreeTDS]
Description     = TDS driver (Sybase/MS SQL)
Driver          = /usr/lib/odbc/libtdsodbc.so
Setup           = /usr/lib/odbc/libtdsS.so
CPTimeout       =
CPReuse         =
FileUsage       = 1

mlambie@ubuntu:/etc$ cat odbc.ini
[ACUMENSERVER]
Driver          = FreeTDS
Description     = ODBC connection via FreeTDS
Trace           = No
Servername      = ACUMENSERVER
Database        = ACUMEN

然后我测试了与isql的连接:

mlambie@ubuntu:~$ isql -v ACUMENSERVER username password
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> use ACUMEN
[][unixODBC][FreeTDS][SQL Server]Changed database context to 'Acumen'.
[ISQL]INFO: SQLExecute returned SQL_SUCCESS_WITH_INFO
SQLRowCount returns -1
SQL> select top 1 firstname from tblClients;

[record returned]

SQLRowCount returns 1
1 rows fetched
SQL> quit

好的,所以我们使用FreeTDS连接到远程MSSQL服务器的ODBC。 剩下的就是将Ruby添加到组合中。

mlambie@ubuntu:~$ sudo aptitude install libdbd-odbc-ruby

最后要测试的是Ruby可以使用DBI和ODBC来访问实际的数据库,这很容易测试:

mlambie@ubuntu:~$ irb
irb(main):001:0> require "dbi" 
=> true
irb(main):002:0> dbh = DBI.connect('dbi:ODBC:ACUMENSERVER', 'username', 'password')
=> #<DBI::DatabaseHandle:0xb7ac57f8 @handle=#<DBI::DBD::ODBC::Database:0xb7ac5744
@handle=#<odbc::database:0xb7ac576c>, @attr={}>, @trace_output=#</odbc::database:0xb7ac576c><io:0xb7cbff54>,
@trace_mode=2>
irb(main):003:0> quit

还有一个更完整的测试(只有SQL SELECT,请注意):

#!/usr/bin/env ruby

require 'dbi'
db = DBI.connect('dbi:ODBC:ACUMENSERVER', 'username', 'password')
select = db.prepare('SELECT TOP 10 firstname FROM tblClients')
select.execute
while rec = select.fetch do
  puts rec.to_s
end
db.disconnect
</io:0xb7cbff54>

从这里(修复odbc lib在错误的地方): http//ubuntuforums.org/showthread.php?t = 43345&page = 2

libtdsodbc.so
with freeTDS (freetds-dev, tdsodbc), you can either edit the path in the odbcinst.ini file for the [FreeTDS] driver section OR cp the /usr/lib/odbc/libtdsodbc.so into /usr/lib/libtdsodbc.so.

从提示符访问mssql时,两种方式都有效

isql -v $dsn $user $passwd

我发现这很有用

http://www.unixodbc.org/doc/FreeTDS.html#Configuration

然后在database.yml文件中:

development:
  adapter: sqlserver
  mode: odbc
  dsn: dsn_name
  username: my_username
  password: my_password

这些是我为Centos 5.3编译的步骤。 为了让这个工作起来,我花了很多的试验和错误。 它来自一个完全干净的Centos安装。

安装EPEL:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

安装ruby,rubygems,freetds,unixODBC,开发工具:

yum install gcc
yum install freetds
yum install ruby-devel
yum install unixODBC-devel
yum install ruby rubygems

安装导轨:

gem install rails

安装与DB相关的宝石:

gem install dbd-odbc
gem install rails-sqlserver-2000-2005-adapter -s http://gems.github.com

下载,构建和安装ruby-odbc:

wget http://www.ch-werner.de/rubyodbc/ruby-odbc-0.9997.tar.gz
tar zxvf ruby-odbc-0.9997.tar.gz
cd ruby-odbc-0.9997
ruby extconf.rb
make
make install

最终宝石清单:

# gem list

*** LOCAL GEMS ***

actionmailer (2.3.2)
actionpack (2.3.2)
activerecord (2.3.2)
activeresource (2.3.2)
activesupport (2.3.2)
dbd-odbc (0.2.4)
dbi (0.4.1)
deprecated (2.0.1)
rails (2.3.2)
rails-sqlserver-2000-2005-adapter (2.2.17)
rake (0.8.7)

您可以使用各种工具(如isql)来测试ODBC连接。 Brian的帖子详细介绍了这一点,所以我不再重复了。 在rails中你需要一个看起来像这样的database.yml:

development:
  adapter: sqlserver
  mode: odbc
  dsn: dsnName
  username: username
  password: password

在Ubuntu上,我使用FreeTDS和activerecord-sqlserver-adapter gem。

您可以通过apt安装FreeTDS:

sudo apt-get install freetds

并将其添加到您的Gemfile:

gem 'activerecord-sqlserver-adapter'

我必须将/etc/freetds/freetds.conf配置的FreeTDS版本号更改为8.0才能使事情正常运行。

[global]
    tds version = 8.0

GitHub上的activerecord-sqlserver-adapter

FreeTDS项目

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM