stule-ru / modernpdo
简单PDO库的源代码。
v3.0.0
2023-09-03 11:21 UTC
Requires
- php: >=8.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.15
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^5.13
README
此仓库包含ModernPDO代码,这是一个用于通过PDO操作数据库的库。
该库保证支持以下数据库: MySQL,MariaDB,PostgreSQL,SQLite3 和自定义PDO。
📝 目录
🧐 关于
此仓库包含ModernPDO代码,这是一个用于通过PDO操作数据库的库。其中包含了一些基本数据库操作工具。
例如,您可以看到用于插入、删除、选择等的类。
您可以使用此库代替PDO,这使得项目开发更加容易。
🏁 入门
安装
该库使用composer自动加载器来包含文件,因此您需要安装 Composer。如果您从未使用过Composer,请阅读 手册。您可以通过命令行或composer.json进行安装。
使用命令行
- 在控制台中运行命令
composer require stule-ru/modernpdo
。
使用composer.json
- 将
"stule-ru/modernpdo": "^3.0.0"
添加到您的composer.json中。
...
"require": {
...
"stule-ru/modernpdo": "^3.0.0"
...
}
...
- 在控制台中运行命令
composer install
。
🎈 用法
关于结构
关于源代码
源代码包含
- 通用类(ModernPDO.php、Factory.php、Escaper.php等)
- 特定DBMS类(它们位于/src/Drivers/*)
这允许您添加代码而不是重写代码(MySQLDriver、PostgreSQLDriver、SQLite3Driver 扩展 ModernPDO 等)
因此,如果您需要,您可以扩展所有通用类以实现您的目标。
通用类
- Actions/* - 查询构建器,如 Select、Update 等。
- Conditions/* - 用于 'select' 的条件构建器,如 Between、In 等。
- Fields/* - 用于 'create/update table' 的字段构建器,如 IntField、TextField 等。
- Functions/* - 聚合和标量函数构建器,如 Count、Upper 等。
- Keys/* - 用于 'create/update table' 的键构建器,如 PrimaryKey、UniqueKey 等。
- Traits* - 包含共享方法(如 where()、columns() 等)的 traits。
- ModernPDO - 用于数据库操作的基础类(方法 exec()、query()、select() 等)。
- Escaper - 用于转义值的基础类。
- Factory - 用于创建新操作、事务等的基础类。
- Statement - 用于处理数据库响应的基础类。
- Transaction - 用于处理事务的基础类。
驱动器
- MariaDB - 用于与 MariaDB 交互的驱动程序。
- MySQL - 用于与 MySQL 交互的驱动程序。
- PostgreSQL - 用于与 PostgreSQL 交互的驱动程序。
- SQLite3 - 用于与 SQLite3 交互的驱动程序。
关于测试
初始化示例
use ModernPDO\ModernPDO; use ModernPDO\Drivers\MySQLDriver; use ModernPDO\Drivers\MariaDBDriver; use ModernPDO\Drivers\PostgreSQLDriver; use ModernPDO\Drivers\SQLite3Driver; // Initiolize by PDO $mpdo = new ModernPDO( pdo: $pdo, ); // Initiolize MySQL $mpdo = new MySQLDriver( host: $host, database: $database, username: $username, password: $password, charset: $charset, //port: $port, ); // Initiolize MariaDB $mpdo = new MariaDBDriver( host: $host, database: $database, username: $username, password: $password, charset: $charset, //port: $port, ); // Initiolize PostgreSQL $mpdo = new PostgreSQLDriver( host: $host, database: $database, username: $username, password: $password, //port: $port, ); // Initiolize SQLite3 $mpdo = new SQLite3Driver( mode: $mode, );
查询示例
// Row query $mpdo->exec('CREATE TABLE table_name (id int, name varchar(32));'); // Prepared queries $stmt = $mpdo->query("SELECT * FROM table_name", []); // Check query status if ($stmt->status()) { // Get counts $stmt->rowCount(); $stmt->columnCount(); $stmt->fetchColumn($column); // Fetch cell $stmt->fetchObject(); // Fetch row as object $stmt->fetch(); // Fetch row as array $stmt->fetchAll(); // Fetch all rows as array }
CRUD 示例
// // Insert example // // INSERT INTO table (id, name) VALUES (10, 'test'), (11, 'test') $mpdo->insert('table')->columns([ 'id', 'name', ])->values([ [10, 'test'], [11, 'test'], ])->execute(); // INSERT INTO table VALUES (12, 'test') $mpdo->insert('table')->values([ [12, 'test'], ])->execute(); // // Select examples // // SELECT * FROM table $mpdo->select('table')->rows(); // SELECT * FROM table WHERE id=10 LIMIT 1 $mpdo->select('table')->where('id', 10)->row(); // SELECT * FROM table WHERE id=10 AND name='test' LIMIT 1 $mpdo->select('table')->where('id', 10)->and('name', 'test')->row(); // SELECT id, name FROM table $mpdo->select('table')->columns(['id', 'name'])->rows(); // SELECT COUNT(*) FROM table $mpdo->select('table')->columns([new Count()])->cell(); // SELECT SUM(amount) FROM table WHERE id BETWEEN 10 AND 50 $mpdo->select('table')->columns([new Sum('amount')])->where('id', new Between(10, 50))->cell(); // SELECT table.id AS id, table.name AS name, join_table.lastname AS lastname FROM table INNER JOIN join_table ON table.id=join_table.id $mpdo->select('table')->columns([ 'id' => 'table.id', 'name' => 'table.name', 'lastname' => 'join_table.lastname', ])->innerJoin('join_table')->on('table.id', 'join_table.id')->rows(); // SELECT * FROM table ORDER BY id ASC $mpdo->select('table')->orderBy('id')->rows(); // SELECT * FROM table LIMIT 1 OFFSET 10 $mpdo->select('table')->limit(1, 10)->row(); // // Update example // // UPDATE table SET name='Mr. Gorski' WHERE id=10 $mpdo->update('table')->set(['name' => 'Mr. Gorski'])->where('id', 10)->execute(); // // Delete example // // DELETE FROM table WHERE id NOT IN (10, 11, 20) $mpdo->delete('table')->where('id', new NotIn([10, 11, 20]))->execute();
表示例
// // Create Table // // CREATE TABLE IF NOT EXISTS table (id INT NOT NULL, email TEXT NOT NULL, name VARCHAR(32) NOT NULL) $mpdo->createTable('table')->checkIfExists()->fields([ new IntField('id'), new TextField('email'), new VarcharField('name', 32), ])->execute(); // CREATE TABLE IF NOT EXISTS table (id INT UNSIGNED NULL DEFAULT 100) $mpdo->createTable('table')->checkIfExists()->fields([ new IntField('id', unsigned: true, canBeNull: true, default: 100), ])->execute(); // CREATE TABLE IF NOT EXISTS table (id INT NOT NULL, PRIMARY KEY (id)) $mpdo->createTable('table')->checkIfExists()->fields([ new IntField('id'), ])->keys([ new PrimaryKey('id'), ])->execute(); // // Update Table // // ALTER TABLE table RENAME TO new_table $mpdo->alterTable('table')->rename('new_table')->execute(); // ALTER TABLE table ADD COLUMN amount INT NOT NULL $mpdo->alterTable('table')->addColumns([ new IntField('amount'), ])->execute(); // ALTER TABLE table RENAME COLUMN column TO new_column $mpdo->alterTable('table')->renameColumns([ 'column' => 'new_column', ])->execute(); // ALTER TABLE table DROP COLUMN column $mpdo->alterTable('table')->dropColumns([ 'column', ])->execute(); // // Drop Table // // DROP TABLE IF EXISTS table $mpdo->dropTable('table')->checkIfExists()->execute();
事务示例
$transaction = $mpdo->transaction(); $transaction->begin(); try { if (!$transaction->isActive()) { // Your code... } // Your code... $transaction->commit(); } catch (\Throwable $ex) { $transaction->rollBack(); throw $ex; }
🔧 运行测试
有很多测试工具:集成/单元测试(PHPUnit)、PHPStan、PSalm 和 CSFixer。
如果您想开始运行测试,需要在终端运行 composer 脚本
注意: 您无法启动集成测试
级别
- PHPStan:级别 9
- PSalm:级别 1
Composer 脚本
测试
composer tests
- 运行所有 PHPUnit 测试(不要运行它)composer i-tests
- 运行集成 PHPUnit 测试(不要运行它)composer u-tests
- 运行单元 PHPUnit 测试composer ca-tests
- 定义所有测试覆盖率(不要运行它)composer ica-tests
- 定义集成测试覆盖率(不要运行它)composer uca-tests
- 定义单元测试覆盖率
PHPStan
composer stan
- 将错误写入 phpstan-report.xmlcomposer stan-bl
- 将错误写入 phpstan-baseline.neon
PSalm
composer salm
- 将错误写入 psalm-report.xmlcomposer salm-bl
- 将错误写入 psalm-baseline.xml
编码规范修复器
composer csfix
- 修复所有 PHP 文件的编码规范
⛏️ 构建
语言
- PHP - 版本 >= 8.1
实用工具
- PHPStan - 静态分析器
- PSalm - 静态分析器
- PHPUnit - 测试框架
- PHP-CS-Fixer - 编码规范修复器