当前位置: 首页 > 文档资料 > Swoole 中文文档 >

Coroutine\PostgreSQL

优质
小牛编辑
147浏览
2023-12-01

协程PostgreSQL客户端。需要编译 ext-postgresql 扩展来开启此功能。

编译安装

下载源代码:https://github.com/swoole/ext-postgresql,必须安装对应的releases版本。

  • 需要确保系统中已安装libpq
  • mac安装完postgresql自带libpq库,环境之间有差异,ubuntu可能需要apt-get install libpq-dev
  • 也可以单独指定libpq库目录如:./configure --with-libpq-dir=/etc/postgresql

使用示例

Co\run(function () {
    $pg = new Swoole\Coroutine\PostgreSQL();
    $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=root password=");
    if (!$conn) {
        var_dump($pg->error);
        return;
    }
    $result = $pg->query('SELECT * FROM test;');
    $arr = $pg->fetchAll($result);
    var_dump($arr);
});

事务处理

Co\run(function () {
    $pg = new Swoole\Coroutine\PostgreSQL();
    $conn = $pg->connect ("host=127.0.0.1 port=5432 dbname=test user=root password=");
    $pg->query('BEGIN');
    $result = $pg->query('SELECT * FROM test');
    $arr = $pg->fetchAll($result);
    $pg->query('COMMIT');
    var_dump($arr);
});

属性

error

获取错误信息。

方法

connect()

建立postgresql非阻塞的协程连接。

Swoole\Coroutine\PostgreSQL->connect(string $connection_string): bool;

!> $connection_string 为连接信息,连接成功返回true,连接失败返回false,可以使用error属性获取错误信息。

  • 示例
Co\run(function () {
    $pg = new Swoole\Coroutine\PostgreSQL();
    $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=wuzhenyu password=");
    var_dump($pg->error, $conn);
});

query()

执行SQL语句。发送异步非阻塞协程命令。

Swoole\Coroutine\PostgreSQL->query(string $sql): resource;
  • 参数

    • string $sql
      • 功能:SQL语句
      • 默认值:无
      • 其它值:无
  • 示例

    • select
    Co\run(function () {
        $pg = new Swoole\Coroutine\PostgreSQL();
        $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=root password=");
        $result = $pg->query('SELECT * FROM test;');
        $arr = $pg->fetchAll($result);
        var_dump($arr);
    });
    • 返回insert id
    Co\run(function () {
        $pg = new Swoole\Coroutine\PostgreSQL();
        $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=wuzhenyu password=");
        $result = $pg->query("insert into test (id,text) VALUES (NULL,'text') RETURNING id ;");
        $arr = $pg->fetchRow($result);
        var_dump($arr);
    });
    • transaction
    Co\run(function () {
        $pg = new Swoole\Coroutine\PostgreSQL();
        $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=root password=");
        $pg->query('BEGIN;');
        $result = $pg->query('SELECT * FROM test;');
        $arr = $pg->fetchAll($result);
        $pg->query('COMMIT;');
        var_dump($arr);
    });

fetchAll()

提取结果中所有行作为一个数组。

Swoole\Coroutine\PostgreSQL->fetchAll(resource $queryResult):? array;

affectedRows()

返回受影响的记录数目。

Swoole\Coroutine\PostgreSQL->affectedRows(resource $queryResult): int;

numRows()

返回行的数目。

Swoole\Coroutine\PostgreSQL->numRows(resource $queryResult): int;

fetchObject()

提取一行作为对象。

Swoole\Coroutine\PostgreSQL->fetchObject(resource $queryResult, int $row): object;
  • 示例
Co\run(function () {
    $pg = new Swoole\Coroutine\PostgreSQL();
    $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=wuzhenyu");
    $result = $pg->query('SELECT * FROM test;');

    $row = 0;
    for ($row = 0; $row < $pg->numRows($result); $row++) {
        $data = $pg->fetchObject($result, $row);
        echo $data->id . " \n ";
    }
});
Co\run(function () {
    $pg = new Swoole\Coroutine\PostgreSQL();
    $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=wuzhenyu");
    $result = $pg->query('SELECT * FROM test;');

    $row = 0;
    while ($data = $pg->fetchObject($result, $row)) {
        echo $data->id . " \n ";
        $row++;
    }
});

fetchAssoc()

提取一行作为关联数组。

Swoole\Coroutine\PostgreSQL->fetchAssoc(resource $queryResult, int $row): array;

fetchArray()

提取一行作为数组。

Swoole\Coroutine\PostgreSQL->fetchArray(resource $queryResult, int $row, $resultType = SW_PGSQL_BOTH): array|false;
  • 参数

    • int $row

      • 功能row 是想要取得的行(记录)的编号。第一行为 0
      • 默认值:无
      • 其它值:无
    • $resultType

      • 功能:常量。可选参数,控制着怎样初始化返回值。
      • 默认值SW_PGSQL_BOTH
      • 其它值:无
      取值返回值
      SW_PGSQL_ASSOC返回用字段名作为键值索引的关联数组
      SW_PGSQL_NUM返回用字段编号作为键值
      PGSQL_BOTH返回同时用两者作为键值
  • 返回值

    • 返回一个与所提取的行(元组/记录)相一致的数组。如果没有更多行可供提取,则返回 false
  • 使用示例

Co\run(function () {
    $pg = new Swoole\Coroutine\PostgreSQL();
    $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=wuzhenyu");
    $result = $pg->query('SELECT * FROM test;');
    $arr = $pg->fetchArray($result, 1, SW_PGSQL_ASSOC);
    var_dump($arr);
});

fetchRow()

根据指定的 result 资源提取一行数据(记录)作为数组返回。每个得到的列依次存放在数组中,从偏移量 0 开始。

Swoole\Coroutine\PostgreSQL->fetchRow(resource $queryResult, int $row): array|false;
  • 返回值

    • 返回的数组和提取的行相一致。如果没有更多行 row 可提取,则返回 false
  • 使用示例

Co\run(function () {
    $pg = new Swoole\Coroutine\PostgreSQL();
    $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=wuzhenyu");
    $result = $pg->query('SELECT * FROM test;');
    while ($row = $pg->fetchRow($result)) {
        echo "name: $row[0]  mobile: $row[1]" . PHP_EOL;
    }
});

metaData()

查看表的元数据。异步非阻塞协程版。

Swoole\Coroutine\PostgreSQL->metaData(string $tableName): array;
  • 使用示例
Co\run(function () {
    $pg = new Swoole\Coroutine\PostgreSQL();
    $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=wuzhenyu");
    $result = $pg->metaData('test');
    var_dump($result);
});

prepare()

预处理。

Swoole\Coroutine\PostgreSQL->prepare(string $name, string $sql);
Swoole\Coroutine\PostgreSQL->execute(string $name, array $bind);
  • 使用示例
Co\run(function () {
    $pg = new Swoole\Coroutine\PostgreSQL();
    $conn = $pg->connect("host=127.0.0.1 port=5432 dbname=test user=wuzhenyu password=112");
    $pg->prepare("my_query", "select * from  test where id > $1 and id < $2");
    $res = $pg->execute("my_query", array(1, 3));
    $arr = $pg->fetchAll($res);
    var_dump($arr);
});