background image
Eric's picture

Here's a quick guide on how to create database schema for your module. The first thing you should do is get acquainted with the Schema API documentation.

You'll need to create a file in your module directory called: MYMODULE.install. In this file, you'll define hook_schema, hook_install, hook_uninstall, etc. Here's an example that defines 3 columns, the primary key, and a unique key.

<?php
function MYMODULE_schema() {
 
$schema = array();

 
$schema['MYTABLE'] = array(
   
'description' => t('MY TABLE DESCRIPTION),
    '
fields' => array(
      '
MYCOLUMN1' => array(
        '
description' => t('MY UNIQUE IDENTIFIER'),
        '
type' => 'serial',
        '
unsigned' => true,
        '
not null' => true,
      ),
      '
MYVARCHAR' => array(
        '
description' => t('MY VAR CHAR'),
        '
type' => 'varchar',
        '
length' => 32,
        '
not null' => true,
      ),
      '
MYTIMESTAMP' => array( // see: user install created
        '
description' => t('MY TIMESTAMP'),
        '
type' => 'int',
        '
not null' => true,
      ),
    ),
    '
indexes' => array(
      '
MYVARCHAR' => array('MYVARCHAR'),
    ),
    '
primary key' => array('MYCOLUMN1'),
    '
unique keys' => array(
      '
MYCOLUMN1' => array('MYCOLUMN1),
    ),
  );        
       
  return
$schema;

}
?>

A full list of data types can be found here.
This documentation explains the structure of the schema array.

Now, you can define how to install and uninstall the schema:

<?php
function MYMODULE_install() {
 
drupal_install_schema('MYMODULE');
}

function
MYMODULE_uninstall() {
 
drupal_uninstall_schema('MYMODULE');
}
?>

More information on schema functions can be found here.

Now, In your module code to write a database record you simply define an array/object containing your columns and the data you'd like to insert, and then use the function drupal_write_record:

<?php
$record
= (object) NULL;
$record->MYVARCHAR = 'BLAH';
$record->MYTIMESTAMP = strtotime('now');
drupal_write_record('MYTABLE', $record);
?>

More information on writing to the database can be found here.

Eric's picture

Big help

The Schema module is essential for creating a schema definition: http://drupal.org/project/schema

Found answer...

I found answer here:

http://api.freestylesystems.co.uk/api/group/schemaapi/6

A key column specifier is either a string naming a column or an array of two elements, column name and length, specifying a prefix of the named column.

As an example, here is a SUBSET of the schema definition for Drupal's 'node' table. It show four fields (nid, vid, type, and title), the primary key on field 'nid', a unique key named 'vid' on field 'vid', and two indexes, one named 'nid' on field 'nid' and one named 'node_title_type' on the field 'title' and the first four bytes of the field 'type'.

hook_schema: Defining Indexes with a not understood 'numeric'

First, I have reviewed the Schema API reference in Drupal.org site: http://drupal.org/node/146939

I have come across some code which is implementing hook_schema and in defining an index it did array('column_name', numeric).

What is this numeric value because it is not explained within the aforementioned online documentation?

Referenced example code using this numeric value within an index definition:

<?php
$schema
['node'] = array(
'fields' => array(
'nid'      => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE),
'vid'      => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
'type'     => array('type' => 'varchar', 'length' => 32, 'not null' => TRUE, 'default' => ''),
'title'    => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''),
),
'primary key' => array('nid'),
'unique keys' => array(
'vid'     => array('vid')
),
'indexes' => array(
'nid'                 => array('nid'),

// Here is the numeric value (4) in question defined within an index
'node_title_type'     => array('title', array('type', 4)), // Here is the numeric value (4) in question.
),
);
?>

Do you know what this is?

Thanks