使用rails项目连接oracle数据库时有2种方法
首先在自己本地的项目中引入两个gem
gem ‘activerecord-oracle_enhanced-adapter’, ‘~> 6.0.0’
gem ‘ruby-oci8’
gem 'activerecord-oracle_enhanced-adapter’它的版本选择可以直接去rubyGems.org文挡中去查看,根据你的rails版本走的
执行bundle
这个时候你会发现有报错,是安装ruby-oci8是报错了,所以你需要安装oracle的客户端和sdk
mac下载地址
https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html
linux下载地址
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
当我们下载OCI 和 SDK之后进行解压,然后将还在路径放在终端的配置中,如果你是zsh就放在 .zshrc , 如果你是bash 就放在 .bashrc中
export OCI_DIR=/Users/instantclient_21_1
export PATH=$PATH:/Users/instantclient_21_1
export DYLD_LIBRARY_PATH=/Users/instantclient_21_1
export NLS_LANG=AMERICAN_AMERICA.UTF8
这些配置需要改成你自己文件放的位置,使用的是绝对路径,配置成功之后重新启动终端
这个时候bundle就不会报错了,可以顺利bundle成功
之后就项目中的配置了
首先我们在数库文件中添加配置(通过服务名进行连接的)(config/database.yml)
例如:
oracle_development:
adapter: oracle_enhanced
database: (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST='IP')(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)))
username: '用户名'
password: '密码'
之后我们可以在项目中创建一个文件,可以在lib下创建,也可以在model下创建
我是在lib下创建了一个文件叫oracle_data.rb
在文件中这样写
module OracleData
class Member < ActiveRecord::Base #Member为方法名,可自定义
establish_connection :oracle_development # oracle_development 为database.yml文件中添加的第二个 DB 配置的名字
self.table_name = '想要连接的表名'
end
class Good < ActiveRecord::Base #OracleExternalData为方法名,可自定义
establish_connection :oracle_development # oracle_development 为database.yml文件中添加的第二个 DB 配置的名字
self.table_name = '想要连接的表名'
end
end
这个时候我们就可以通过rails的方法调用oracle数据库中的数据了
例如
OracleData::Member.first
这就像我们平时使用rails模型进行调用数据是一样滴
有的时候你会发现使用方法1是不好用,因为有数据库层的外键时rails调用会有写问题(这个问题还没有具体研究出解决方法)
但是我们可以通过另一种方法祢补一下,可以通过调用ORI8的实例
connection=OCI8.new("用户名","密码","IP:1521/ORCL")
#在依照官方文档的写法
connection.exec("SELECT * FROM tables rownum <= 10") do |r| p r; end
#这样就可以通过返回的数组对值进行操作
服务器上使用方法是一样的,只不过使用的客户端是linux就ok了