You are here

Schema API in Drupal 8

Same name and namespace in other branches
  1. 6 includes/database.inc \schemaapi
  2. 7 includes/database/schema.inc \schemaapi
  3. 9 core/lib/Drupal/Core/Database/database.api.php \schemaapi
  4. 10 core/lib/Drupal/Core/Database/database.api.php \schemaapi

API to handle database schemas.

A Drupal schema definition is an array structure representing one or more tables and their related keys and indexes. A schema is defined by hook_schema(), which usually lives in a modulename.install file.

By implementing hook_schema() and specifying the tables your module declares, you can easily create and drop these tables on all supported database engines. You don't have to deal with the different SQL dialects for table creation and alteration of the supported database engines.

hook_schema() should return an array with a key for each table that the module defines.

The following keys are defined:

  • 'description': A string in non-markup plain text describing this table and its purpose. References to other tables should be enclosed in curly brackets.
  • 'fields': An associative array ('fieldname' => specification) that describes the table's database columns. The specification is also an array. The following specification parameters are defined:

    • 'description': A string in non-markup plain text describing this field and its purpose. References to other tables should be enclosed in curly brackets. For example, the users_data table 'uid' field description might contain "The {users}.uid this record affects."
    • 'type': The generic datatype: 'char', 'varchar', 'text', 'blob', 'int', 'float', 'numeric', or 'serial'. Most types just map to the according database engine specific data types. Use 'serial' for auto incrementing fields. This will expand to 'INT auto_increment' on MySQL. A special 'varchar_ascii' type is also available for limiting machine name field to US ASCII characters.
    • 'mysql_type', 'pgsql_type', 'sqlite_type', etc.: If you need to use a record type not included in the officially supported list of types above, you can specify a type for each database backend. In this case, you can leave out the type parameter, but be advised that your schema will fail to load on backends that do not have a type specified. A possible solution can be to use the "text" type as a fallback.
    • 'serialize': A boolean indicating whether the field will be stored as a serialized string.
    • 'size': The data size: 'tiny', 'small', 'medium', 'normal', 'big'. This is a hint about the largest value the field will store and determines which of the database engine specific data types will be used (e.g. on MySQL, TINYINT vs. INT vs. BIGINT). 'normal', the default, selects the base type (e.g. on MySQL, INT, VARCHAR, BLOB, etc.). Not all sizes are available for all data types. See DatabaseSchema::getFieldTypeMap() for possible combinations.
    • 'not null': If true, no NULL values will be allowed in this database column. Defaults to false.
    • 'default': The field's default value. The PHP type of the value matters: '', '0', and 0 are all different. If you specify '0' as the default value for a type 'int' field it will not work because '0' is a string containing the character "zero", not an integer.
    • 'length': The maximal length of a type 'char', 'varchar' or 'text' field. Ignored for other field types.
    • 'unsigned': A boolean indicating whether a type 'int', 'float' and 'numeric' only is signed or unsigned. Defaults to FALSE. Ignored for other field types.
    • 'precision', 'scale': For type 'numeric' fields, indicates the precision (total number of significant digits) and scale (decimal digits right of the decimal point). Both values are mandatory. Ignored for other field types.
    • 'binary': A boolean indicating that MySQL should force 'char', 'varchar' or 'text' fields to use case-sensitive binary collation. This has no effect on other database types for which case sensitivity is already the default behavior.

    All parameters apart from 'type' are optional except that type 'numeric' columns must specify 'precision' and 'scale', and type 'varchar' must specify the 'length' parameter.

  • 'primary key': An array of one or more key column specifiers (see below) that form the primary key.
  • 'unique keys': An associative array of unique keys ('keyname' => specification). Each specification is an array of one or more key column specifiers (see below) that form a unique key on the table.
  • 'foreign keys': An associative array of relations ('my_relation' => specification). Each specification is an array containing the name of the referenced table ('table'), and an array of column mappings ('columns'). Column mappings are defined by key pairs ('source_column' => 'referenced_column'). This key is for documentation purposes only; foreign keys are not created in the database, nor are they enforced by Drupal.
  • 'indexes': An associative array of indexes ('indexname' => specification). Each specification is an array of one or more key column specifiers (see below) that form an index on the table.

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, this is the schema definition for the 'users_data' table. It shows five fields ('uid', 'module', 'name', 'value', and 'serialized'), the primary key (on the 'uid', 'module', and 'name' fields), and two indexes (the 'module' index on the 'module' field and the 'name' index on the 'name' field).

$schema['users_data'] = [
  'description' => 'Stores module data as key/value pairs per user.',
  'fields' => [
    'uid' => [
      'description' => 'The {users}.uid this record affects.',
      'type' => 'int',
      'unsigned' => TRUE,
      'not null' => TRUE,
      'default' => 0,
    ],
    'module' => [
      'description' => 'The name of the module declaring the variable.',
      'type' => 'varchar_ascii',
      'length' => DRUPAL_EXTENSION_NAME_MAX_LENGTH,
      'not null' => TRUE,
      'default' => '',
    ],
    'name' => [
      'description' => 'The identifier of the data.',
      'type' => 'varchar_ascii',
      'length' => 128,
      'not null' => TRUE,
      'default' => '',
    ],
    'value' => [
      'description' => 'The value.',
      'type' => 'blob',
      'not null' => FALSE,
      'size' => 'big',
    ],
    'serialized' => [
      'description' => 'Whether value is serialized.',
      'type' => 'int',
      'size' => 'tiny',
      'unsigned' => TRUE,
      'default' => 0,
    ],
  ],
  'primary key' => [
    'uid',
    'module',
    'name',
  ],
  'indexes' => [
    'module' => [
      'module',
    ],
    'name' => [
      'name',
    ],
  ],
  // For documentation purposes only; foreign keys are not created in the
  // database.
  'foreign keys' => [
    'data_user' => [
      'table' => 'users',
      'columns' => [
        'uid' => 'uid',
      ],
    ],
  ],
];

See also

drupal_install_schema()

File

core/lib/Drupal/Core/Database/database.api.php, line 236
Hooks related to the Database system and the Schema API.

Functions

Namesort descending Location Description
db_add_field Deprecated core/includes/database.inc Adds a new field to a table.
db_add_index Deprecated core/includes/database.inc Adds an index.
db_add_primary_key Deprecated core/includes/database.inc Adds a primary key to a database table.
db_add_unique_key Deprecated core/includes/database.inc Adds a unique key.
db_change_field Deprecated core/includes/database.inc Changes a field definition.
db_create_table Deprecated core/includes/database.inc Creates a new table from a Drupal table definition.
db_drop_field Deprecated core/includes/database.inc Drops a field.
db_drop_index Deprecated core/includes/database.inc Drops an index.
db_drop_primary_key Deprecated core/includes/database.inc Drops the primary key of a database table.
db_drop_table Deprecated core/includes/database.inc Drops a table.
db_drop_unique_key Deprecated core/includes/database.inc Drops a unique key.
db_field_exists Deprecated core/includes/database.inc Checks if a column exists in the given table.
db_field_names Deprecated core/includes/database.inc Returns an array of field names from an array of key/index column specifiers.
db_field_set_default Deprecated core/includes/database.inc Sets the default value for a field.
db_field_set_no_default Deprecated core/includes/database.inc Sets a field to have no default value.
db_find_tables Deprecated core/includes/database.inc Finds all tables that are like the specified base table name.
db_index_exists Deprecated core/includes/database.inc Checks if an index exists in the given table.
db_rename_table Deprecated core/includes/database.inc Renames a table.
db_table_exists Deprecated core/includes/database.inc Checks if a table exists.
drupal_get_installed_schema_version core/includes/schema.inc Returns the currently installed schema version for a module.
drupal_get_module_schema core/includes/schema.inc Returns a module's schema.
drupal_get_schema_versions core/includes/schema.inc Returns an array of available schema versions for a module.
drupal_install_schema core/includes/schema.inc Creates all tables defined in a module's hook_schema().
drupal_schema_get_field_value Deprecated core/includes/schema.inc Typecasts values to proper data types.
drupal_set_installed_schema_version core/includes/schema.inc Updates the installed version information for a module.
drupal_uninstall_schema core/includes/schema.inc Removes all tables defined in a module's hook_schema().
hook_schema core/lib/Drupal/Core/Database/database.api.php Define the current version of the database schema.
_drupal_schema_initialize core/includes/schema.inc Fills in required default values for table definitions from hook_schema().

Constants

Namesort descending Location Description
SCHEMA_UNINSTALLED core/includes/schema.inc Indicates that a module has not been installed yet.

Classes

Namesort descending Location Description
Schema core/lib/Drupal/Core/Database/Driver/sqlite/Schema.php SQLite implementation of \Drupal\Core\Database\Schema.
Schema core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php PostgreSQL implementation of \Drupal\Core\Database\Schema.
Schema core/lib/Drupal/Core/Database/Driver/mysql/Schema.php MySQL implementation of \Drupal\Core\Database\Schema.