Getting Rails connected to Microsoft SQL Server from OS X requires two things:
1) An ODBC driver manager – unixODBC and iODBC are the most popular.
2) An ODBC driver – Almost all solutions involve FreeTDS, an open source library that allows for connecting to MS SQL Server and Sybase.
I first tried following the instructions in HowtoConnectToMicrosoftSQLServerFromRailsOnLinux but ran into some difficulties with getting FreeTDS to talk to unixODBC. However, a fallback is available since iODBC comes pre-installed with the OS.
——
Successfully made connection using:
——
I used `port install …` all the way. I found the iODBC version in the about page for ‘ODBC Administrator’. If anyone can explain how to load the sql server drivers into this gui, I’d appreciate it. — MattScilipoti
——
Assuming you already have ActiveRecord installed the only thing you will need to download and install is FreeTDS.
You can install FreeTDS using MacPorts with:
<pre>sudo port install freetds</pre>
You want to compile?
(Check here for help installing FreeTDS.)
Once FreeTDS is installed you can check your settings by running:
<pre>% tsql -C
My settings were:
<pre>Compile-time settings (established with the "configure" script):
Version: freetds v0.63
MS db-lib source compatibility: no
Sybase binary compatibility: unknown
Thread safety: yes
iconv library: yes
TDS version: 8.0
iODBC: yes
unixodbc: no
You don’t have to have exactly these settings. The real test comes after you create the config.
——
NOTE: You can avoid messing with these config files, see the DSN-less note at the bottom of the page.
Next you need to configure the following files as indicated: Note: If you did NOT install via MacPorts you probably use /usr/local.
/opt/local/etc/freetds/freetds.conf:
Add a section to the bottom of the file (remove the parenthetical comments):
[YOUR_DB_DEFINITION_NAME]
host = 192.168.1.101 (change this to the right one for you)
port = 1433
tds version = 4.2 (might be 8.0, check the docs for the version of SQL Server you are running)
TEST!
- tsql -S YOUR_DB_DEFINITION_NAME -U USERNAME -P PASSWORD
You should see and do the following to make sure all went well:
locale is "en_US.ISO-8859-15"
locale charset is "ISO-8859-15"
1> use YOUR_ACTUAL_DB_NAME
2> go
1> select * from users (do this for a table that exists in your db)
2> go
id login
1 user1
3 user2 (make sure you get correct output)
1> quit
——
Now we create the ODBC configs.
You should be able to do this using the ‘ODBC Administrator’, but I couldn’t find out how. — MattScilipoti
Two options are available TDS or JDBC drivers.
h3. TDS
Since we just installed FreeTDS, I used it (gleaned from HowtoConnectToMicrosoftSQLServerFromRailsOnFreeBSD) . These paths assume `port install freetds`. If you compiled it, you know how to find it. – MattScilipoti
/Library/ODBC/odbcinst.ini:
[TDS]
Description = FreeTDS
Driver = /opt/local/lib/libtdsodbc.so
UsageCount = 1
/Library/ODBC/odbc.ini:
[YOUR_DB_DEFINITION_NAME]
Driver = TDS
Description = ODBC connection to via FreeTDS
Trace = No
Servername = YOUR_DB_DEFINITION_NAME
Database = YOUR_ACTUAL_DB_NAME
/Library/ODBC/odbcinst.ini:
[ODBC Drivers]
JDBC = Installed
[JDBC]
Description = Sybase JDBC Server
Driver = /usr/local/lib/libtdsodbc.so
Setup = /usr/local/lib/libtdsodbc.so
/Library/ODBC/odbc.ini:
[ODBC Data Sources]
MySQLServer = JDBC
[MyDSN]
Driver = /usr/local/lib/libtdsodbc.so
Description = Description of this database connection
Trace = yes
TraceFile = /tmp/odbc.log
Servername = MySQLServer
Database = YOUR_ACUTAL_DB_NAME
——
TEST your odbc configs:
<pre>% iodbctest "dsn=MyDSN;uid=USERNAME;pwd=PASSWORD"
You should be able to run SQL commands at this point. If so, congratulations: you have a working DSN and are 80% of the way to getting Rails working with ODBC under OS X.
——
Now you need to install a couple of Ruby libraries: ruby-dbi and ruby-odbc.
If you’re using MacPorts, you can do:
<pre>sudo port install rb-odbc
sudo port install rb-dbi +dbd_odbc
</pre>
Compilers, type away.
<pre>cd ~/tmp
curl -O <a href="http://www.ch-werner.de/rubyodbc/ruby-odbc-0.996.tar.gz">http://www.ch-werner.de/rubyodbc/ruby-odbc-0.996.tar.gz</a>
tar vxzf ruby-odbc-0.996.tar.gz
cd ruby-odbc-0.996
ruby extconf.rb
make
sudo make install</pre>
Find latest version of ruby-dbi at http://rubyforge.org/projects/ruby-dbi/
<pre>cd ~/tmp
curl -O <a href="http://rubyforge.org/frs/download.php/655/ruby-dbi-all-0.0.23.tar.gz">http://rubyforge.org/frs/download.php/655/ruby-dbi-all-0.0.23.tar.gz</a>
tar vxzf ruby-dbi-all-0.0.23.tar.gz
cd ruby-dbi-all
ruby setup.rb config --with=dbi,dbd_odbc
ruby setup.rb setup
sudo ruby setup.rb install
Test Connection from Ruby:
Heres a quick way to see if ruby can talk to SQL Server provided by Mark Imbriaco:
# irb1.8
irb(main):001:0> require "dbi"
=> true
irb(main):004:0> dbh = DBI.connect('dbi:ODBC:YOUR_DB_DEFINITION_NAME', 'USERNAME', 'PASSWORD')
=> #<DBI::DatabaseHandle:0xb7d28688 @trace_output=#<IO:0xb7d79064>, @trace_mode=2,
@handle=#<DBI::DBD::ODBC::Database:0xb7d28480 @attr={},
@handle=#<ODBC::Database:0xb7d284a8>>>
irb(main):005:0> quit
Note: if you installed RoR using MacPorts, ensure your odbc.ini and odbcinst.ini are in /opt/local/etc or else Ruby will complain that it can’t find your DSNs.
——
All that remains now is to configure conf/database.yml:
<pre>development:
adapter: sqlserver
mode: odbc
dsn: MyDSN
username: USERNAME
password: PASSWORD
——
Note: As of Rails 2.0.2, this is no longer needed.
Please note: should you run rake from your application root at this point you will receive failure messages along the lines of:
<pre>sh: line 1: scptxfr: command not found
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:21: command not found: scptxfr /s /d /I /F db /q /A /r
sh: line 1: osql: command not found
The Rake file lib/tasks/databases.rake assumes you have these two utilities installed; unfortunately they’re Windows only. See defect 3298
There is a gem for this…rubyforge.org… mssqlclientadapter
——
Note: You can avoid the configuration file mess of FreeTDS and ODBC by using a DSN-less connection string in your database.yml.
development:
adapter: sqlserver
mode: odbc
dsn: DRIVER=/opt/local/lib/libtdsodbc.so;TDS_Version=8.0;SERVER=sqlserver.com;DATABASE=DBNAME;Port=14330;uid=dbusername;pwd=dbpassword;
—
Rails 2.1.0 users may see the following error:
/Library/Ruby/Site/1.8/rubygems.rb:142:in `activate':Gem::Exception: can't activate activerecord (= 1.15.6, runtime), already activated activerecord-2.1.0
This was resolved by installing the activerecord-sqlserver-adapter gem:
sudo gem install activerecord-sqlserver-adapter --source=http://gems.rubyonrails.org