NAME
MKDoc::SQL - Database abstraction layer
IMPORTANT NOTE
This module is quite old since it was written back in 2000 - so don't expect state-of-the art Perl code. However it's been in use in production environments for a long time - hence it should be fairly stable - at least in places :).
SYNOPSIS
In your Perl code:
# civilization.pl
use MKDoc::SQL::Table;
MKDoc::SQL::Table->load_state ("/path/to/def/dir");
# let's populate the table...
$cities_t->insert (
City_Name => 'Bordeaux',
Country => 'France',
);
# ...more inserts here...
# Fetch all Japanese cities
my $cities_t = MKDoc::SQL::Table->table ('Cities');
my $query = $cities_t->search (Country => 'Japan');
my @jp_cities = $query->fetch_all();
# Oh no! the Brits rise once again!
$bordeaux = $cities_t->get (City_Name => 'Bordeaux'. Country => 'France');
$bordeaux->{Country} = 'United Kingdom';
$cities_t->modify ($bordeaux);
# Frenchies go berserk! Launch the nukes!
$cities_t->delete (Country => 'United Kingdom');
# Global nuke war! Civilization is destroyed!
$cities_t->erase();
__END__
SUMMARY
MKDoc::SQL is a simple database abstraction layer. It features a database driver so that (in theory) multiples database can be supported, however I only ever got around to writing the MySQL driver.
OVERVIEW
MKDoc::SQL works with a schema which you define somewhere in your code. Once the schema is on disk, the following operations become possible:
- Storing the schema on disk for later retrieval
- Deploying the schema (creating the tables)
- Do common operations on the database
Furthermore, MKDoc::SQL offers more than one table type:
- MKDoc::SQL::Table - Simple table object
- MKDoc::SQL::IndexedTable - Table with reverse index of wheighted keywords
- MKDoc::SQL::Category - Hierarchical structure table
MKDoc::SQL also offers the ability to optionally define a Perl class associated with each table, so that records fetched from the database are automatically blessed into objects rather than simple hash references.
The goal of MKDoc::SQL is to let you use relational databases (which are a proven, robust technology) while getting rid of as much SQL as possible from your code - because well, SQL is ugly.
GETTING STARTED
Choosing a definition directory
If you're writing an application which uses a database, most likely you will have to have an install script since it is necessary to deploy the database - i.e. create all the tables and maybe populate the database a little.
Your schema will be written into a definition directory which will contain:
- a driver.pl file which contains the database connection object
- one or more .def files - one per table
For the sake of the example, we'll assume the following:
- The schema will live in /opt/yourapp/schema
- The database will be MySQL
- The database name will be 'test'
- The database user will be 'root'
- The password will be undefined
The driver.pl file:
This is what the /opt/yourapp/schema/driver.pl file should look like. Ideally, you'd want your install script to generate this file.
use MKDoc::SQL;
MKDoc::SQL::DBH->spawn (
database => 'test',
user => 'root',
);
MKDoc::SQL::Table->driver ('MySQL');
__END__
Deploying the schema:
In order to write the .def files, we need to define the schema by instanciating a bunch of objects and then calling the save_state() method. This is done as follows:
use MKDoc::SQL;
# define the database schema
new MKDoc::SQL::Table (
bless_into => 'YourApp::Object::City', # optional
name => 'Cities',
pk => [ qw /ID/ ], # primary key
ai => 1, # auto_increment the primary key
unique => { country_unique => [ qw /Country/ ] } # unique constraint
cols => [
{ name => 'ID', type => new MKDoc::SQL::Type::Int ( not_null => 1 ) },
{ name => 'City_Name', type => new MKDoc::SQL::Type::Char ( size => 255, not_null => 1 ) },
{ name => 'Country', type => new MKDoc::SQL::Type::Char ( size => 255, not_null => 1 ) }
] );
# write the schema onto disk
MKDoc::SQL::Table->save_state ('/opt/yourapp/schema');
__END__
Note that you are not limited to defining MKDoc::SQL::Table objects. If you need to implement weighted keyword searches, you can define MKDoc::SQL::IndexedTable objects in your schema. If you need hierarchical structures, use MKDoc::SQL::Category objects instead.
Also, there are many column types which you can define. See MKDoc::SQL::Type::ALL for a reference.
Deploying the database
Now that your schema directory is correctly set up, it's time to actually create the database.
use MKDoc::SQL;
MKDoc::SQL::Table->load_driver ('/opt/yourapp/schema');
MKDoc::SQL::Table->create_all();
MKDoc::SQL::DBH->disconnect();
__END__
Once you've done that, and if everything went well, you can start performing operations on the database using MKDoc::SQL.
Using the database
Look at MKDoc::SQL::Table, MKDoc::SQL::IndexedTable and MKDoc::SQL::Category.
EXPORTS
None.
AUTHOR
Copyright 2000 - MKDoc Holdings Ltd.
Author: Jean-Michel Hiver <jhiver@mkdoc.com>
This module free software and is distributed under the same license as Perl itself. Use it at your own risk.