Integrating
Perl and Databases
|
|
|
Making simple things easy
and difficult things possible |
|
|
|
Tim Bunce |
Why?
Why Perl?
|
|
|
|
Fewer lines of code |
|
faster development / fewer errors /
easier maintenance |
|
“A picture is worth a thousand words”
vs “Can’t see the wood for the trees” |
|
Freedom of expression - “There’s more
than one way to do it” |
|
The tool builders tool factory |
Why Perl for Databases?
|
|
|
|
Ideally suited to data processing: |
|
parsing, cleansing / filtering /
merging and formatting |
|
Applications |
|
Data Migration |
|
Data acquisition and reporting |
|
Web Page creation |
|
Building sharper tools faster |
Your Mission...
|
|
|
should you choose to accept it... |
The Task
|
|
|
Read a tabular text report file of
product codes and costs |
|
CODE DESCRIPTION COST OTHER NOTES |
|
---- -----------
------ ------------------- |
|
1201 WIDGET 37A
500.00 LEFT HANDED ONLY |
|
1202 BRACKET X7J
790.00 REDUCED FROM 800.00 |
|
1203 FLANGE 9Q7
449.00 LIMITED STOCK |
|
Read a CSV file of product codes, price
markup and comments |
|
1201,0.90,Special Offer for
limited period only |
|
1202,1.30, |
|
Output a new tabular report containing
the new product prices and comments word wrapped in a narrow field |
Reading the CSV file
|
|
|
open MARGIN, “<margin.csv” or die
“open margin.csv: $!”; |
|
while (<MARGIN>) { |
|
chop; |
|
|
|
($prod, $margin, $notes) = split /,/; |
|
|
|
$prod_margin{$prod} = $margin; |
|
$prod_notes{$prod} = $notes; |
|
} |
Defining the Output Format
|
|
|
format STDOUT_TOP = |
|
Code
Price Notes |
|
----
------- -------- |
|
. |
|
|
|
format STDOUT = |
|
@>>> ^###.##
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
|
$prod, $cost, $note |
|
~~
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
|
$note |
|
. |
|
|
Writing the New Report
|
|
|
open COST, "<cost.txt" or
die "open cost.txt: $!"; |
|
while ($line = <COST>) { |
|
next unless $line =~ m/^\d/; |
|
|
|
($prod, $cost) = unpack 'A4 @20 A7', $line; |
|
|
|
$cost *= $prod_margin{$prod} || 1.10; |
|
$note =
$prod_notes{$prod} || 'n/a'; |
|
|
|
write; # using format with
$prod, $cost and $note |
|
} |
|
|
Mission Accomplished!
|
|
|
Code
Price Notes |
|
----
------- -------- |
|
1201
450.00 Special offer for
limited |
|
period only |
|
1202
1027.00 n/a |
|
1203
493.90 n/a |
|
|
Change
is the only Constant
“Cache the data for other
uses!”
|
|
|
dbmopen(%price_cache,
"price_cache", 0644) or die …; |
|
|
|
while ($line = <COST>) { |
|
. . . |
|
write; # using format with
$prod, $cost and $note |
|
|
|
$price_cache{$prod} = "$cost
$note"; |
|
} |
“Update the Prices in a
Database!”
|
|
|
use DBI; |
|
|
|
$db = DBI->connect('dbi:ODBC:PRICE',
'user', 'password', |
|
{ RaiseError => 1 }); |
|
$upd = $db->prepare('UPDATE prices
SET price=? WHERE prod=?'); |
|
$ins = $db->prepare('INSERT INTO
prices(prod,price) VALUES (?,?)'); |
|
|
|
while ($line = <COST>) { |
|
. . . |
|
$rows = $upd->execute($price, $prod); |
|
$ins->execute($prod,$price) if $rows == 0; |
|
} |
|
$db->commit; |
“Now get Cost Data from a
Database!”
|
|
|
Original Code |
|
|
|
open COST, "<cost.txt" or
die "open cost.txt: $!"; |
|
while ($line = <COST>) { |
|
next unless $line =~ m/^\d/; |
|
($prod, $cost) = unpack 'A4 @20 A7', $line; |
|
. . . |
|
|
|
New Code |
|
$costs = $cost_db->prepare('SELECT
prod,cost FROM costs'); |
|
$costs->execute; |
|
while ( ($prod, $cost) =
$costs->fetchrow_array ) { |
|
. . . |
|
|
|
|
What Is the Perl DBI?
|
|
|
The standard Database Interface for
Perl |
|
“A perl module and specification that
defines a consistent database interface independent of the actual database
being used” |
Why the Perl DBI?
|
|
|
|
Once upon a time… |
|
One language, many database interfaces |
|
A vision of the future... “DBperl” |
|
Talk, talk, talk - the dbperl-interest
mailing list |
|
Perl 5 - A new way |
|
Modules and Objects. The DBI is born. |
|
The future is now… |
|
ODBC, Oracle, Informix, Ingres, mSQL,
mysql, DB2, Solid, Sybase, Postgress, Quickbase, Empress, Fulcrum, ... |
Making simple things
easy
and difficult things possible
|
|
|
|
Goals |
|
Be simple to use for simple
applications |
|
Have sufficient flexibility to
accommodate unusual functionality and non-SQL databases |
|
Conform to applicable standards (ODBC
etc.) |
|
Enable the creation of
database-independent Perl scripts without being limited to the lowest
functionality |
|
Be free. |
|
A ‘higher-level’ interface than
ODBC/JDBC |
Getting Technical...
Under the Hood
|
|
|
DBI defines and implements an interface |
|
Driver modules do much of the real work |
|
DBI provides default methods,
functions, tools etc for drivers |
|
Not limited to the lowest common
denominator - mechanism provided for
driver specific extensions |
|
Designed and built for speed |
|
Valuable detailed call
tracing/debugging built-in |
A Picture is Worth...
State of the Nation
|
|
|
|
DBI builds and runs on many systems |
|
Unix, Windows 95, Windows NT, VMS etc |
|
Many drivers exist |
|
more in development |
|
Merging the ODBC/JDBC ‘inheritance’ |
|
data types, meta-data etc |
|
Specifying the unspecified |
|
Documenting the undocumented |
What Next?
|
|
|
SQL for Non-SQL data sources |
|
Networking for Non-Networked data
sources |
|
Template driver for command line
interfaces |
|
Data types, especially
date/time/interval |
|
Non-blocking (method calls return at
once) |
|
Multi-threading |
|
Binding In/Out Variables |
|
Binding Arrays |
Comparing DBI and
Alternatives
(Attempting the Impossible!)
So why use the Perl DBI?
|
|
|
|
Because... |
|
It delivers what it promises |
|
It’s here, there and everywhere |
|
It’s fast, flexible and well proven |
|
It’s free, with source |
|
Commercial support is available |
|
It has a large user base and a strong
future |
So What?
Success Stories in Industry
|
|
|
|
|
Large Scale Data Migration |
|
by Michael Peppler |
|
Database Interfaced Web Pages |
|
by Frank San Filippo |
|
The British Telecom
Call Management Information Service |
|
by Tim Bunce |
Too Good to Be True?
|
|
|
Just three examples of many |
|
Thousands of Perl DBI developers around
the world |
|
Millions of users of DBI powered web
sites |
|
Oracle and Apache web servers with
built-in Perl and DBI |
|
Commercial support available from The
Perl Clinic |
And finally...
|
|
|
“We have replaced all Netscape
JavaScript code with Perl DBI/DBD to Informix” - Del Simmons, Cox Interactive
Media. |
|
“I have found performance and stability
to be exceptional” - Stuart Huges, PECC. |
|
“Perl and DBI saved our butt. The tool
we came closest to purchasing was SQR but it just doesn’t have the
flexibility and power of Perl/DBI.” - Jared Still, RxNet. |
|
“I have been able to recommend the
Perl/DBI route to a number of our clients and all of them have been pleased
with the results” - Paul Rubenis, Ulysses Telemedia Networks |
The end.