When you create a web application you sometimes need database transparency in your code. By this I mean you want your code to work regardless of the type or brand of database choosen by the end user.
Ruby DBI is not a true connection layer. Many install it thinking that it will help them connect to their MySQL database and then they find that nothing works. Ruby DBI is an abstration layer or so called "wrapper" class that filters multiple differences in database code into a single interface. So if a Oracle database, MySQL and PostGreSQL all have different syntax for selecting a database row it will not matter in your code. In your code the selection of a row will be the same for all three.
Using Ruby DBI has its pluses as described earlier but it also has some drawbacks. One of these is that since the DBI module has no connectivity capabilities on it's own you have to install other software to support it. This means that if you want to support six different database you will first have to make sure that there are six "real" and working connection drivers present.
If you are planning only to support one database type then you may want to skip using DBI. The reason for this is that DBI can limit the what the database is capable of doing. You may want to use a new feature that has no DBI counterpart. You may find that when using DBI with certain databases you lose performance. If these are not concerns then DBI is a good solution for maintaining database portability.
Because MySQL is the most popular of the listed database I will use it as a basis for the examples and instructions for use of DBI. There will be other list of examples in later turorials.
Before you install the Ruby DBI module for MySQL you will have to install Ruby MySQL. As mentioned DBI will not work on it's own. So before you continue here you will should follow the previous tutorial on installing Ruby MySQL. Windows users can also find information in the table below. Notice that though DBI supports many databases Ruby does not. If you know of a source for database drivers that are missing in this table please contact us.
| DB | DBI dependacies | Driver Linux | Driver Windows |
| ADO | Requires win32ole, part of the Ruby standard library. | ||
| DB2 | Depends on ruby-db2 there is also a DB2 package for Rails that contains DB2 and all the drivers for Ruby. | site | |
| Frontbase | Depends on ruby-frontbase | download | |
| Firebird | Depends on fireruby package | download | download |
| mSQL | Depends on ruby- msql | ||
| MySQL | Depends on ruby-mysql | site | download |
| ODBC | Depends on the ruby-odbc | download | download |
| Oracle | Depends on the the ruby-oci8 | download | download |
| PostGreSQL | Depends on either the postgres or postgres-pr | download | |
| Proxy | Depends on distributed Ruby (DRb), part of the Ruby standard library. | ||
| SQLite3 | Depends on the sqlite3 | download | download |
| SQLRelay | Depends on the sqlrelay package at http://sqlrelay.sourceforge.net/ |
Once you have installed the database drivers needed and possibly database servers then you can move on to getting DBI installed. This installation routine is the same on both Linux and Windows machines with the exception of expanding the compressed archives. If you are using Windows then you will need a zip file handler that has support for *.tar.gz files. Most of the lastest software has this, I use WinRar but 7-zip is an excellent open source and free windows archiving program. 7-zip supports just about every format you could think of and does command line if you want. You can also install Cygwin and follow the Linux way of doing things.
http://ruby-dbi.sourceforge.net/
After downloading the compressed tar file, which you should unpack after downloading it. For example, if the current version is 0.0.19, the distribution file can be unpacked using either of the following commands:
% tar zxf ruby-dbi-all-0.0.19.tar.gz % gunzip < ruby-dbi-all-0.0.19.tar.gz | tar xf -
You will want to run the following command to get a list of the names to use in your configuration of the setup.
% ruby setup.rb --help
will get you a list of dbd driver names.
% ruby setup.rb config
Normally you would change directories at the command prompt and start your installation by configuring the setup.rb script in the DBI directory. This command without arguements looks like this:
% ruby setup.rb config
If you use this command without parameter then you almost certainly will get an error on installation. This is because without parameters the install script will try and install all DBI drivers regardless of the fact that there are no backing database drivers present. To avoid this installation error should set specific parameters for those databases that are actually available . For example, to configure only the main DBI for MySQL and PostGreSQL use the following. Take notice of the comma used to seperate the different driver names. It is also best to use the commands this way because
% ruby setup.rb config --with=dbi,dbd_mysql,dbd_postgre
After configuring the distribution, build and install it:
% ruby setup.rb setup % ruby setup.rb install
You may need to run the installation command as root in Linux. The previous commands work on Cygwin if you are using this environment. In plain Windows the command prompt should already be running in administrator level for either the Windows native command prompt. Those percentage chararacters would be replaced by a Windows directory indicator
c:\> ruby setup.rb config --with=dbi,dbd_mysql,dbd_postgre

Version of the DBI Interface
Example:
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("dbi:Mysql:test:localhost", "testuser", "testpass")
# get server version string and display it
row = dbh.select_one("SELECT VERSION()")
puts "Server version: " + row[0]
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
ensure
# disconnect from server
dbh.disconnect if dbh
end
Exception for errors related to the database.
Has three attributes: err, errstr and state.
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("dbi:Mysql:test:localhost", "testuser", "testpass")
# get server version string and display it
row = dbh.select_one("SELECT VERSION()")
puts "Server version: " + row[0]
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
ensure
# disconnect from server
dbh.disconnect if dbh
end
Connect to the database specified by driver_url, which may
look like "dbi:Oracle:oracle.neumann".
Returns a DBI::DatabaseHandle object, or if called with a code-block,
calls this block with the new DBI::DatabaseHandle as parameter and
calls disconnect after calling the block if it was not yet disconnected by
the user.
Sets the trace mode for all subsequently created Handles to these values.
If a parameter is nil, the value is not changed.
mode defaults to 2 if it is nil, and output to STDERR if a value was not
previously set.
For mode, the values 0, 1, 2 or 3 are allowed.
Note: Tracing is only activated if you load the module "dbi/trace", because tracing currently
depends on AspectR > 0.3.3.
Abstract base class for all "Handles" (DriverHandle, DatabaseHandle, StatementHandle).
Sets the trace mode for this handle as well as for all sub-handles (in the case of DriverHandle and
DatabaseHandle).
If a parameter is nil, the value is not changed.
mode defaults to 2 if it is nil, and output to STDERR if a value was not
previously set.
For mode, the values 0, 1, 2 or 3 are allowed.
Note: Tracing is only activated if you load the module "dbi/trace", because tracing currently
depends on AspectR > 0.3.3.
Immediately executes the SQL statement stmt after binding
the values in bindvars to the placeholders in the statement.
Returns a DBI::StatementHandle, or if called with a code-block,
calls the block with the handle as its parameter and after that
calls #finish onto the handle to free all resources.
Executes the statement after binding the values to the parameters, then returns all
resulting rows as an array of DBI::Row objects.
If called as an iterator, the passed DBI::Row objects are only references.
Returns true if the connection is active, otherwise false.
In contrast to connected?, ping tests if the connection is
still active by executing some SQL or doing something else.
Binds the value value to a placeholder.
The placeholder is represented by param, which is either a
String representing the name of the
placeholder used in the SQL statement (e.g., Oracle: "SELECT * FROM EMP WHERE ENAME = :ename"),
or an integer that indicates the number of the placeholder.
Placeholder numbers begin at 1.
attribs is not yet used in this version, but could later be a hash containing more information
like parameter type, etc.
Returns a DBI::Row object, or nil if there are
no more rows to fetch.
When called as an iterator, the block is called for each row
until no more rows are available. Each row is passed to the
block as a DBI::Row object.
Note that the returned or passed DBI::Row object is only a reference and
should be copied (dup) if it is stored elsewhere.
Returns the current row as an Array or nil if no more
rows are available.
Can also be called as an iterator.
Returns the current row as a Hash or nil if no more
rows are available.
Can also be called as an iterator.
Returns an Array of the next cnt rows, which are
stored as DBI::Row objects.
Returns the empty array [] if there are no more rows.
direction is one of the following constants:
offset is a positive or negative number (only when SQL_FETCH_RELATIVE is used).
fetch_scroll does not automatically free the result set if no more rows are available,
e.g., if you get the last row.
Returns a DBI::Row object, or nil if no row is available.
Note that the returned DBI::Row object is only a reference and
should be copied (dup) if it is stored elsewhere.
Happy Publishing!
are you succeeded connect to firebird using dbi?
Are there any Linux webhosts that actually have Firebird installed?