denismilovanov/libpostgres

此包已被弃用且不再维护。没有建议的替代包。
此包最新版本(1.2.3)没有可用的许可证信息。

PHP PostgreSQL 函数的轻量级包装

1.2.3 2015-04-21 16:10 UTC

This package is not auto-updated.

Last update: 2018-12-08 22:00:57 UTC


README

PHP PostgreSQL 函数(pg_connect, pg_query 等)的轻量级包装。
它只是一个包装,数据库访问层,不是ORM。

##安装

composer require denismilovanov/libpostgres

##示例

####让我们从连接开始

$oDB = new \LibPostgres\LibPostgresDriver(array(
    'host' => 'localhost',
    'port' => 5432,
    'user_name' => 'test',
    'user_password' => 'test',
    'db_name' => 'test',
));

####开始事务,查询,提交

$oDB->startTransaction();
$oDB->query("
    CREATE TABLE IF NOT EXISTS users (
        id bigserial NOT NULL,
        type_id integer NOT NULL,
        kind_id integer NOT NULL,
        name varchar(255) NOT NULL,
        birth_date date NOT NULL,
        CONSTRAINT users_pkey PRIMARY KEY (id)
    );
");
$oDB->query("
    DELETE FROM users;
    ALTER SEQUENCE users_id_seq RESTART WITH 1;
");
$oDB->commit();

PostgreSQL 具有完美的强大事务引擎。
所有单条 DML 和 DDL 查询(如果没有指定其他)都在自动提交模式下执行。
但我们决定在这个包装器中禁止自动提交,即使是单条 DML/DDL 查询也不例外。
因此,您必须显式开始事务并说提交(或回滚)。
(你知道,“能力越大,责任越大”。)
在未开始事务的情况下尝试执行查询时,包装器会抛出异常。
手动控制事务迫使您更多地思考正在发生的事情 :)

####事务中的单个查询,占位符

$oDB->t()->query("
    INSERT INTO users
        SELECT  nextval('users_id_seq'::regclass),
                (random() * ?d)::integer + 1,
                (random() * ?d)::integer + 1,
                name || ' ' || surname,
                ('1960-01-01'::date + interval '1 day' * (random() * 1000)::integer)::date
            FROM    unnest(array[?w]) AS name,
                    unnest(array[?w]) AS surname;
",
    2,
    3,
    array('Ann', 'Bob', 'Christin', 'Dave', 'Eve', 'George'),
    array('Adams', 'Black', 'Cole')
);

您可以使用名为 t() 的方法执行单个事务。
这简化了生活,但告诉每个人“这是一个事务! :)”

您还可以在查询中使用占位符。占位符是

  • ?d - 整数(使用 intval),或整数数组,
  • ?f - 浮点数(使用 floatval),或浮点数数组,
  • ?w - 字符串、文本、日期、时间戳等,或这些类型的扁平数组(使用 pg_escape_string),
  • ?h - hstore(扁平键值数组,它将被转换为 'key1 => value1, ...'::hstore),
  • ?j?jb - JSON 或 JSONB,
  • ? - 不进行准备的单个替换。

占位符的值应在查询文本之后传递给方法。

####选择单个字段

$sFullName = $oDB->selectField("
    SELECT name
        FROM users
        ORDER BY birth_date DESC
        LIMIT 1;
");
echo $sFullName . "\n";

我的输出是

Eve Adams

####选择单个记录

$aUser = $oDB->selectRecord("
    SELECT id, name
        FROM users
        ORDER BY birth_date ASC
        LIMIT 1;
");
echo json_encode($aUser) . "\n";

我的输出(注意我使用了 json_encode) - 哈希表

{"id":"18","name":"George Cole"}

####选择列

$aUsersNames = $oDB->selectColumn("
    SELECT name
        FROM users
        ORDER BY birth_date ASC
        LIMIT 3;
");
echo json_encode($aUsersNames) . "\n";

我的输出(仍然使用 json_encode) - 请求名称的扁平数组

["George Cole","Bob Black","Dave Black"]

####选择索引列

$aUsersNamesDates = $oDB->selectIndexedColumn("
    SELECT name, birth_date
        FROM users
        ORDER BY birth_date ASC
        LIMIT 3;
");
echo json_encode($aUsersNamesDates) . "\n";

选择中的第一个键将是索引,第二个是值,让我们看看编码后的结果

{"George Cole":"1960-01-27","Bob Black":"1960-04-08","Dave Black":"1960-04-10"}

####选择表

$aUsers = $oDB->selectTable("
    SELECT id, name, birth_date
        FROM users
        ORDER BY id DESC
        LIMIT 3;
");
echo json_encode($aUsers) . "\n";

它返回哈希表列表

[{"id":"18","name":"George Cole","birth_date":"1961-05-27"},{"id":"17","name":"George Black","birth_date":"1961-04-15"},{"id":"16","name":"George Adams","birth_date":"1961-12-27"}]

####选择索引表

$aUsers = $oDB->selectIndexedTable("
    SELECT id, name, birth_date
        FROM users
        WHERE name ~ ?w
        ORDER BY birth_date ASC
",
    'Dave'
);
echo json_encode($aUsers) . "\n";

第一个键将是索引

{"12":{"id":"12","name":"Dave Cole","birth_date":"1960-08-25"},"10":{"id":"10","name":"Dave Adams","birth_date":"1960-10-29"},"11":{"id":"11","name":"Dave Black","birth_date":"1961-06-01"}}

####选择两个索引列

$aUsers = $oDB->select2IndexedColumn("
    SELECT type_id, kind_id, name
        FROM users
        ORDER BY type_id, kind_id, name
");
echo json_encode($aUsers) . "\n";

第一个和第二个键成为索引,第三个键成为值。查询生成

{"1":{"1":"Bob Black","2":"Dave Black","3":"George Adams","4":"Ann Black"},"2":{"1":"George Black","2":"Christin Cole","3":"Eve Black","4":"George Cole"},"3":{"2":"Bob Adams","3":"Eve Adams"}}

还支持 select2IndexedTableselect3IndexedColumnselect3IndexedTable

异常

查询格式错误将导致异常

try {
    $oDB->startTransaction();
    $oDB->query("
        INSERT ;
    ");
    $oDB->commit();
} catch (Exception $oException) {
    echo "An exception caught: " . $oException->getMessage() . "\n";
    die;
}

输出

An exception caught: ERROR:  syntax error
LINE 2:             INSERT ;

在约束违反、死锁、服务器问题等情况下也会抛出异常。

注意

  • select-smth 方法不需要显式开始事务,并且它们不限制您使用自动提交模式下的 DML,如 INSERT INTO ... RETURNING
  • 要使用 pg_pconnect 而不是 pg_connect,将 persistence => 1persistence => PGSQL_CONNECT_FORCE_NEW 传递给构造函数。