The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

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.