Drupal 数据库层是建立在PHP的PDO扩展之上的,PDO 提供了一套统一的,面向对象的接口用来访问不同的数据库引擎,但它没有为不同的数据库SQL方言提供抽象。
因为不同的数据库需要不同的交互方式,Drupal数据库层需要每个数据库类型提供一个驱动。一个驱动由一系列位于 includes/database/driver 的文件组成,驱动名作为惟一标识代表这个驱动。大多数情况下驱动名是数据库名的小写,例如:mysql,pgsql 或者 mycustomdriver。
每个驱动是由核心数据库系统的父类中派生的一些类组成。这些驱动特定的类可以覆盖任何父类中的行为以更好的支持那个数据库类型。驱动特定的类总是被命名为父类名后面加下划线再加驱动名。例如,MySQL特定版本的 InsertQuery 被命名为 InsertQuery_mysql。
一个连接是继承自PDO类的 DatabaseConnection 类的一个实例对象。每一个Drupal连接的数据库都关联一个单一的连接对象。这些连接对象必须是每个驱动的子类。
为了创建和访问一个连接对象要使用如下代码:
<?php
$conn = Database::getConnection($target, $key);
?>关于Target和Key参数的更多信息请参看相关文档页 Database configuration。
访问当前激活的连接对象,使用如下代码:
<?php
$conn = Database::getConnection();
?>这将得到当前激活连接的默认Target。
注意,大多数情况下你不需要直接请求连接对象,而是用那些面向过程的封装函数。唯一需要直接访问连接对象的原因是假如你正在做的复杂逻辑处理是基于不止一个数据库,而你不想改变当前激活的数据库。
设置激活连接要用如下代码:
<?php
db_set_active($key);
?>关于Target和Key参数的更多信息请参看相关文档页 Database configuration。
一个查询是发送给数据库连接的一个SQL语句。Drupal数据库系统支持六种类型的查询方式:Static, Dynamic, Insert, Update, Delete 和 Merge。一些查询使用SQL语句,而另一些查询则是使用面向对象的查询构建器。一个查询对象指的是为各种查询类型创建的一个查询构建器实例。
一个结果集对象是一个Select查询的结果。其总是 DatabaseStatement 类或其子类的实例。DatabaseStatement 类扩展自 PDOStatement 类。
Drupal 为所有的查询使用准备语句(prepared statements)。一个准备语句是为哪些执行时将被插入变量值的查询提供的模块。可以把准备语句想象成SQL语句的函数,使用时需要传相应的参数。
使用PDO的话,人们必须明确的创建一个准备语句对象,然后执行要传入和查询中的占位符匹配的一些值。然后这个语句对象就可以作为一个结果集被循环访问。事实上准备语句(statement)和结果集(result)是同义词,但仅当一个语句对象被执行之后。
Drupal没有直接的使用准备语句机制,而是模块开发者使用一个查询对象或者一次性的SQL语句执行一个查询,然后查询结果的语句对象被返回。这里语句对象(statement object)和结果集(result set)或多或少可以理解成一个意思。