techwilk/database

一个简单的 PDO/MySQLi/SQLite 包装器,使执行 SQL 查询更加容易

维护者

详细信息

git.sr.ht/~techwilk/database

1.0.1 2024-07-08 19:32 UTC

This package is not auto-updated.

Last update: 2024-09-30 20:56:13 UTC


README

一个围绕 PDO/MySqli/SQLite 的轻量级包装器,具有一致的接口,并包含辅助函数以快速轻松地构建和运行查询。

对于选择语句和其他复杂查询,您应编写原始参数化 SQL,使用“问号”语法。

安装

  1. 通过 composer 安装(composer require techwilk/database
  2. 为 PDO / MySqli / SQLite 创建数据库实例
use TechWilk\Database\MySqli\MySqliDatabase;

$database = new MySqliDatabase(
    'localhost',
    'database-name',
    'username',
    'password',
);

选择

可用函数

  • query
  • runQuery

示例

无运行时参数

$result = $database->query('SELECT * FROM `users`');
$rows = $result->fetchAll();
var_dump($rows);

带运行时参数

$parameters = [1];
$result = $database->query('SELECT * FROM `users` WHERE id = ?', $parameters);
$row = $result->fetch();
var_dump($row);

代码库中其他地方生成的查询

function customQueryBuilder() {
    $parameters = [1];
    $query = new Query(
        'SELECT * FROM `users` WHERE id = ?',
        $parameters,
    );
    return $query;
}

$query = customQueryBuilder();
$result = $database->runQuery($query);
$row = $result->fetch();
var_dump($row);

插入

可用函数

  • insert
  • insertOnDuplicate
  • query
  • runQuery

创建新的简单记录

$data = [
    'id' => 3,
    'name' => 'Tim Jones',
    'auth_id' => 'xxx123yyy',
    'date_created' => '2022-03-03 00:00:00',
];
$id = $database->insert('users', $data);
var_dump($id);

创建并处理潜在的关键字冲突

$data = [
    'name' => 'admin', // unique key
    'uses_count' => 1,
];
$onDuplicate = [
    'uses_count +' => 1, // += 1
];
$id = $database->insertOnDuplicate('tags', $data, $onDuplicate);
var_dump($id);

复杂的跨表插入

$sql = 'INSERT INTO users (`id`, `name`, `auth_id`, `date_created`) VALUES (?, ?, ?, ?)'
$parameters = [
    3, // id
    'Tim Jones', // name
    'xxx123yyy', // auth_id
    '2022-03-03 00:00:00', // date_created
];
$id = $database->query($sql, $parameters);
var_dump($id);

更新

可用函数

  • update
  • updateUsingIn
  • updateChanges
  • selectAndUpdate
  • query
  • runQuery
$data = [
    'name' => 'Timothy Jones',
];
$rowCount = $database->update('users', $data, ['id' => 3]);
var_dump($rowCount);

删除

可用函数

  • delete
  • deleteUsingIn
  • query
  • runQuery
$rowCount = $database->delete('table', ['id' => 3]);
var_dump($rowCount);

测试

  • phpunit.xml.dist 复制到 phpunit.xml
  • 填写环境详细信息
  • 运行 composer test

测试环境

  • 需要每个可用数据库的副本

MySQL

  • 创建 podman 网络 database-tests

  • 
    
  • 使用 podman exec -it database-percona mysql -uroot -p

  • mysql> CREATE DATABASE tests;
  • mysql> `CREATE USER tests@% IDENTIFIED BY 'create-random-password-here';`
  • mysql> `GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON tests.* TO tests@%;`
  • mysql> FLUSH PRIVILEGES;
  • mysql> exit

  • 确保您记下数据库公开的端口(使用 podman ps)。这很可能是一个很大的数字,例如 44449