denismilovanov / libpostgres
PHP PostgreSQL 函数的轻量级包装
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"}}
还支持 select2IndexedTable
、select3IndexedColumn
、select3IndexedTable
。
异常
查询格式错误将导致异常
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 => 1
或persistence => PGSQL_CONNECT_FORCE_NEW
传递给构造函数。