rotexsoft/sqlschema

提供使用PDO从数据库读取表名和列的功能。此包是基于 https://packagist.org.cn/packages/aura/sqlschema ( https://github.com/auraphp/Aura.SqlSchema ) 的分支。它添加了PHP 8.1+支持,并设计用于与Mariadb 10.4+及以上版本一起工作。

3.1.1 2024-02-23 00:27 UTC

This package is auto-updated.

Last update: 2024-08-25 23:12:36 UTC


README

通过PDO连接从数据库读取表名和列的功能。

前言

此分支已经针对与MariaDB兼容进行了优化,而Aura.SqlSchema不支持MariaDB。此分支已在以下数据库上进行了测试

  • Mariadb 10.4.x, 10.5.x, 10.6.x, 10.11.x, 11.0.x, 11.1.x & 11.2.x
  • Mysql 5.6, 5.7, 8.0.x & 8.3.x
  • Postgres 12.x, 13.x, 14.x, 15.x & 16.x

将来将进行一些工作,以确保它与Microsoft Sql Server兼容

安装

此库需要PHP 8.1或更高版本;我们原则上建议使用最新可用的PHP版本。它没有用户空间依赖。

可以通过Composer安装和自动加载,作为 rotexsoft/sqlschema

或者,下载一个版本或克隆此仓库,然后要求或包含其 autoload.php 文件。

质量

Coverage Status Run PHP Tests and Code Quality Tools

要在命令行中运行单元测试,在包根目录下运行 phpunit。(这需要 PHPUnit 作为 phpunit 可用。)

此库试图遵守 PSR-1PSR-2PSR-4。如果您注意到遵守上的疏忽,请通过拉取请求发送补丁。

分支

以下是此仓库中的分支

  • 2.x: 对应于原始 Aura.SqlSchema 仓库中的 2.x 分支。没有计划积极维护此分支,但它可以与 Aura.SqlSchema 仓库 同步(即,可以拉入该仓库中 2.x 分支的变化)。

  • php-8-deprecation-fixes: 此分支从 2.x 分支开始,包含使代码库符合PHP 8.1+和将最低PHP版本提高到8.1的更改。它原本打算作为要提交给 Aura.SqlSchema 仓库 的分支。请参阅 auraphp#22

  • rotexsoft-3.x: 此分支从 php-8-deprecation-fixes 分支开始。由于以下更改,它不再与原始 Aura.SqlSchema 包 兼容

    • Aura\SqlSchema 命名空间更改为 Rotexsoft\SqlSchema
    • 在代码库中应用了更严格的类型提示,导致接口方法签名的一些更改。

    这将是一个分支,其中包含 rotexsoft/sqlschema 版本 3.x 的代码。

未来还将有类似 rotexsoft-4.x 的分支,用于 4.x 及以上版本。

测试

如果您至少运行过一次 composer updatecomposer install 命令,则应该有一个 ./phpunit.xml 文件。

编辑 ./phpunit.xml 以包含 MySql 和 Postgres 的正确数据库连接信息,或者注释掉 MySql 和 Postgres 变量以仅针对 Sqlite 进行测试,然后运行以下命令进行测试:

./vendor/bin/phpunit

如果您正在运行已安装 podman 的 Linux 操作系统,您可以使用 ./run-tests-against-multiple-db-versions.php 脚本对 MariaDB、MySql 和 Postgres 的多个版本进行更广泛的测试。

入门指南

实例化

使用匹配的 PDO 实例实例化特定驱动程序的 schema 对象

<?php
use Rotexsoft\SqlSchema\ColumnFactory;
use Rotexsoft\SqlSchema\MysqlSchema; // for MySQL
use Rotexsoft\SqlSchema\PgsqlSchema; // for PostgreSQL
use Rotexsoft\SqlSchema\SqliteSchema; // for Sqlite
use Rotexsoft\SqlSchema\SqlsrvSchema; // for Microsoft SQL Server
use PDO;

// a PDO connection
$pdo = new PDO(...);

// a column definition factory
$column_factory = new ColumnFactory();

// the schema discovery object
$schema = new MysqlSchema($pdo, $column_factory);
?>

获取表列表

要获取数据库中的表列表,请执行 fetchTableList()

<?php
$tables = $schema->fetchTableList();
foreach ($tables as $table) {
    echo $table . PHP_EOL;
}
?>

获取列信息

要获取表中列的信息,请执行 fetchTableCols()

<?php
$cols = $schema->fetchTableCols('table_name');
foreach ($cols as $name => $col) {
    echo "Column $name is of type "
       . $col->type
       . " with a size of "
       . $col->size
       . PHP_EOL;
}
?>

每个列描述都是一个具有以下属性的 Column 对象

  • name: (string) 列名称

  • type: (string) 列数据类型。数据类型如数据库所报告。

  • size: (int) 列大小。

  • scale: (int) 列的十进制位数,如果有。

  • notnull: (bool) 列被标记为 NOT NULL 吗?

  • default: (mixed) 列的默认值。请注意,有时这可能为 null,如果基础数据库将自动设置时间戳。

  • autoinc: (bool) 列是自动递增的吗?

  • primary: (bool) 列是主键的一部分吗?