【问题标题】:Connecting to SQL Server with ActiveRecord使用 ActiveRecord 连接到 SQL Server
【发布时间】:2009-04-06 15:24:02
【问题描述】:

您是否曾经必须使用 ActiveRecord 连接到 SQL Server?这可能吗?谁能提供一些起点?

【问题讨论】:

    标签: sql-server ruby-on-rails activerecord


    【解决方案1】:

    这是我用的:

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

    安装

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

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

    $ 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 让 ODBC 连接到远程 MSSQL 服务器。剩下的就是将 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 库在错误的位置): http://ubuntuforums.org/showthread.php?t=433435&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
    

    【讨论】:

      【解决方案2】:

      这些是我为 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
      

      安装数据库相关的 gem:

      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
      

      【讨论】:

        【解决方案3】:

        在 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
        

        activerecord-sqlserver-adapter on GitHub

        FreeTDS project

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-20
          • 2015-10-30
          • 2011-11-18
          • 2016-04-14
          相关资源
          最近更新 更多