理解数据库抽象层

老葛的Drupal培训班 Think in Drupal

使用一个数据库抽象层API时,你可能感觉不到它的好,直到有一天你决定不再使用它的时候,你才能发现它的全部优点。你是否曾经遇到过这样的项目,它需要修改数据库系统的代码,你花费了大量的时间,通过仔细的审查每段代码,来将它们改为特定数据库的函数和查询?有了数据库抽象层,你就不需要再考虑不同数据库系统之间函数名的细微差别,只要你使用的是符合ANSI SQL的语句,那么你就不再需要为不同的数据库编写单独的查询语句了。举例来说,在Drupal中没有直接使用mysql_query()或者pg_query(),而是使用的db_query(),这样就将业务层和数据库层隔离了开来。
  Drupal的数据库层是轻量级的,它主要用于两个目的。第一个目的是使你的代码不会绑定在特定的数据库上。第二个目的是清理用户向查询语句中提交的数据,以阻止SQL注入攻击。这一层是建立在以下原理之上的:使用sql比重新学习一门新的抽象层的语言更方便。
    Drupal还有一个模式API,它允许你以一种通用的方式向Drupal描述你的数据库模式(也就是,你将使用哪些表和字段),然后让Drupal将其翻译成所用数据库的特定sql语句。当我们学习.install文件时,将会对其进行详细的讨论。
    通过检查你的settings.php文件内部的变量$db_url,Drupal来判定要连接的数据库的类型。例如,如果$db_url的开始部分为“mysql”,那么Drupal将包含进来includes/database.mysql.inc. 如果$db_url的开始部分为“pgsql”,那么Drupal将包含进来includes/database.pgsql.inc.图5-1给出了这一机制。
    作为一个例子,让我们比较一下db_fetch_object()在MySQL和PostgreSQL抽象层中不同之处:
// From database.mysqli.inc.
function db_fetch_object($result) {
if ($result) {
return mysql_fetch_object($result);
}
}
// From database.pgsql.inc.
function db_fetch_object($result) {
if ($result) {
return pg_fetch_object($result);
}
}
    如果你所用的数据库还未被支持,你可以通过为你的数据库实现相应的包装函数来建立你自己的数据库驱动器。更多详细,可参看本章最后部分的”编写你自己的数据库驱动器”。
图5-1 通过检查变量$db_url,Drupal判定需要包含进来哪个数据库文件。
   

Drupal版本: