Rails 通过 ActiveRecord 访问原有的数据库, rails 如何连接 sqlserver 2008

mumu · 2015年12月21日 · 最后由 yakjuly 回复于 2015年12月22日 · 3112 次阅读

公司内部有多个系统,现在一个新系统用 rails 来写,需要用到其他系统的数据,想用 rails 将其他系统用到的数据进行封装为 restful 的 api,新系统通过 Activeresource 来访问其他系统的数据。 目前是想通过 ActvieRecord 直接访问原数据库,mysql 是可以访问成功的,访问 sqlserver2008 的时候貌似就没有连接上,大家有没有相关资料推荐一下?

Build your own api::Activeresource. The #find, #save etc actions are actually making api calls.

如果对数据访问性权限不是那么敏感的话,也可以在新系统中直接配置多个数据源,直接用 activerecord 访问旧数据,这样做好处是减少数据 marshal 的消耗,毕竟读取数据封装 json 快不过直连数据库,缺点自然是直接暴露数据库,权限什么的没法控制,看项目需要了

#2 楼 @alucardpj 恩,现在就是通过 ActiveRecord 直接访问数据,测试时用的 mysql 数据可以访问到,不过原数据库使用的是 sqlserver2008,貌似就没有连接上

#3 楼 @mumu 这应该是数据库驱动的问题吧

试试 TinyTds

只是访问 sqlserver 数据的话,我用这个 https://rubygems.org/gems/tiny_tds

查询数据的话在 Model 里写几个方法就可以了,如果想要用 ActiveRecord 的 Api,这个方法还不行。

正好我们一个项目就是用了 mysql 和 sql server。

Gem 用

gem "tiny_tds", "~> 0.6.1"
gem 'activerecord-sqlserver-adapter', "~> 4.2.4" #看SQL Server的版本

database.yml

development:
  adapter: mysql2
  database: my_app_dev
  host: localhost
  reconnect: true
  username: root
  password: 
  pool: 5
  encoding: utf8


mssql_development: &development_mssql_base
  adapter: sqlserver
  username: *****
  password: *****
  port: 1433
  tds_version: 80 #看 SQL Server的版本
  login_timeout: 60
  timeout: 5
  encoding: utf8

class SqlServerBaseModel < ActiveRecord::Base
  self.abstract_class = true
  establish_connection(:mssql_development)
end

app/models

class User < ActiveRecord::Base
  # 默认连 mysql
end

class AnotherModel < SqlServerBaseModel
  #链接的是 SQL Server
end

init/speed_up_sql_server.rb

# 加上下面的内容会执行 SQL语句更快,否则大量查询时, SQL Server会出现性能问题。
# Speed up SQL Server Query
ActiveRecord::ConnectionAdapters::SQLServer::DatabaseStatements.class_eval do
  def execute_sp_executesql(sql)
    proc_name = "sp_executesql #{quote(sql)}"
    result = execute_procedure(proc_name)
    return result
  end
  def execute_sp_executesql_noexception(sql)
    begin
      execute_sp_executesql(sql)
    rescue => e
      return nil
    end
  end

  def select(sql, name = nil, binds = [])
    exec_query(sql, name, binds)
  end
end

需要 登录 后方可回复, 如果你还没有账号请 注册新账号