XP Framework 的 RDBMS 支持

v13.3.0 2024-03-24 13:21 UTC

README

Build status on GitHub Build status on AppVeyor XP Framework Module BSD Licence Requires PHP 7.0+ Supports PHP 8.0+ Latest Stable Version

RDBMS 访问 API、连接管理器、反向工程、O/R 映射。

DriverManager 模型

要从驱动管理器获取连接类,您需要使用 rdbms.DriverManager 类。

use rdbms\DriverManager;

$conn= DriverManager::getConnection('sybase://user:pass@server/NICOTINE');

DriverManager 类期望一个统一的连接字符串(我们称其为 DSN)。

支持的驱动

DriverManager 将根据 DSN 字符串中的名称选择适当的驱动。这将加载一个实现类,该类可能基于 PHP 扩展或实现与数据库系统在用户代码中通信的协议。在后一种情况下,您不需要对 PHP 设置进行任何操作;如果存在对 PHP 扩展的硬依赖,您必须在能够使用驱动之前安装它。

基础知识

一旦我们获取了特定的数据库连接类,我们现在可以调用它的一系列方法。

选择

选择可以通过“一站式”方法 select() 完成,该方法将所有结果返回到数组中。或者,query() 方法允许迭代获取。

$news= $conn->select('news_id, caption, author_id from news');
// $news= [
//   [
//     'news_id'   => 12,
//     'caption'   => 'Hello World',
//     'author_id' => 1549
//   ]
// ]

$q= $conn->query('select news_id, caption, author_id from news');
while ($record= $q->next()) {
  // $record= [
  //   'news_id'   => 12,
  //   'caption'   => 'Hello World',
  //   'author_id' => 1549
  // ]
}

插入

要将参数“绑定”到 SQL 查询中,查询、选择、更新、删除和插入方法提供 printf 样式的标记和解码器,并支持可变参数语法。这些为您处理 NULL、类型处理和适当的转义。

$conn->insert('
  into news (
    caption, author_id, body, extended, created_at
  ) values (
    %s, -- caption
    %d, -- author_id
    %s, -- body
    %s, -- extended
    %s  -- created_at
  )',
  $caption,
  $authorId,
  $body,
  $extended,
  Date::now()
);

更新

如果感兴趣,update()delete() 方法将返回受影响行数。

$conn->update('news set author_id= %d where author_id is null', $authorId);

删除

即使您的 RDBMS 要求您使用单引号(或其它),API 也会为您处理字符串字面量的重写。

$conn->delete('from news where caption = "[DELETE]"');

异常

上述所有方法都会在失败的 SQL 查询、语法错误、连接失败等情况下抛出异常。所有这些异常都是 rdbms.SQLException 的子类,因此要捕获所有可能的错误,请在捕获子句中使用它。

+ rdbms.SQLException
|-- rdbms.ConnectionNotRegisteredException
|-- rdbms.SQLConnectException
|-- rdbms.SQLStateException
`-- rdbms.SQLStatementFailedException
    |-- rdbms.SQLConnectionClosedException
    `-- rdbms.SQLDeadlockException

事务

要开始事务,您可以使用连接的 begin()commit()rollback() 方法,如下所示

public function createAuthor(...) {
  $tran= $conn->begin(new Transaction('create_author'));

  try {
    $id= $conn->insert('into author ...');
    $conn->insert('into notify ...');

    $tran->commit();
    return $id;
  } catch (SQLException $e) {
    $tran->rollback();
    throw $e;
  }
}

注意:并非所有数据库系统都支持事务,并且支持事务的那些系统中,并非所有都支持嵌套事务。请务必阅读您访问的 RDBMS 的手册页面。