资讯专栏INFORMATION COLUMN

YII2命令行实现数据库表结构文档自动生成

Jason_Geng / 3220人阅读

摘要:因为要写关于数据库表说明的文档,需要有表结构,如果一个个表去建表格,然后在复制每个字段进去,那就太没效率了。其实程序很简单,用程序获取数据库,再写入到文件文件格式里就可以了。因为项目是基于框架,所以用的命令工具来实现。

因为要写关于数据库表说明的文档,需要有表结构,如果一个个表去建表格,然后在复制每个字段进去,那就太没效率了。其实程序很简单,用程序获取数据库Schema,再写入到markdown文件(文件格式md)里就可以了。因为项目是基于YII2框架,所以用YII2的命令工具来实现。大概的效果图如下:


 * @since 2018-01-18
 */
class TableSchemaController extends Controller
{
    /**
     * 数据库表生成
     */
    public function actionCreate()
    {
        global $argv;

        if (!$argv[2] || strcasecmp($argv[2], "help") === 0) {
            echo "Usage: ./yii table-schema/create [all|tablename] [filename]
";
            exit;
        }

        $db = Yii::$app->db;
        $allTables = $db->getSchema()->getTableNames();

        if ("all" === $argv[2]) {
            $tables = array_diff($allTables, $this->filterTables());
        } else {
            if (!in_array($argv[2], $allTables)) {
                echo sprintf("%s isn"t exist 
", $argv[2]);
                exit;
            }
            $tables = (array)$argv[2];
        }

        // 当前数据库没有表
        if (count(array_filter($tables)) == 0) {
            echo "Database has not table 
";
        }

        $root = dirname(dirname(dirname(__FILE__)));
        $filename = $argv[3] ? $argv[3] : "/docs/note/数据库设计及字典说明.md";
        $filePath = $root . $filename;

        $fp = fopen($filePath, "a+");
        if (!$fp) {
            echo "Open file failed 
";
        }

        foreach ($tables as $table) {
            $schema = $db->getTableSchema($table, true);
            if (!$schema->columns) {
                continue;
            }

            fwrite($fp, "#### $schema->name 表 
");

            // 表头
            $header = "| 字段名 | 类型 | 说明 | 
";
            $header .= "|:--------:|:---------:|:-------:| 
";
            fwrite($fp, $header);

            // 字段
            $row = "";

            foreach ($schema->columns as $col => $obj) {
                $comment = $obj->isPrimaryKey ? "主键" : $obj->comment;
                $row .= "| $obj->name | $obj->dbType | $comment | 
";
            }

            fwrite($fp, $row);
            fwrite($fp, "

");

            echo "$schema->name successfully 
";
        }

        fclose($fp);
    }

    /**
     * 需要过滤的表(不希望生成文档的表)
     * @return array
     */
    protected function filterTables()
    {
        $filterTables = [
            "tbmigration",
            "tbAuthAssignment",
            "tbAuthItemChild",
            "tbAuthRule",
            "tbItemTable"
        ];

        return $filterTables;
    }

    /**
     * 所有表
     * @return string[]
     */
    protected function allTables()
    {
        return Yii::$app->db->getSchema()->getTableNames();
    }

    /**
     * 清空
     */
    public function actionClear()
    {
        global $argv;

        if (!$argv[2] || strcasecmp($argv[2], "help") === 0) {
            echo "Usage: ./yii table-schema/clear [filename]
";
            exit;
        }

        $root = dirname(dirname(dirname(__FILE__)));
        $filePath = $argv[2] ? $argv[2] : "/docs/note/数据库设计及字典说明.md";
        $filePath = $root . $filePath;

        if (!is_file($filePath)) {
            echo "$filePath isn"t exists 
";
            exit;
        }

        $fp = fopen($filePath, "w");
        if (!$fp) {
            echo "Open file failed 
";
        }

        fwrite($fp, "");
        fclose($fp);

        echo "Clear successfully 
";
    }
}

执行命令:

./yii table-schema/create [all|tablename] [filename] 
# 例如生成所有表到test.md文件 
./yii table-schema/create all test.md
# 生成user表到test.md文件
./yii table-schema/create user test.md
# 清空文档
./yii table-schema/clear [filename]

程序很简单,但是很实用~~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28120.html

相关文章

  • Yii2的无编程migrate示例

    摘要:它分为这么几个部分,这是下的标准执行命令,没什么好说的。,前面这是里执行的标准命令,后面是说明我们要创建一个新的文件。,引号里的内容详细说明了我们要创建的这张数据库表中的字段名称及类型等。 认识总是在不断进步的,其实事情远远没有这么复杂,我们只需要安装一个插件就够了: composer require -dev --prefer-dist insolita/yii2-migration...

    张红新 评论0 收藏0
  • Yii2 起步 之创建项目

    摘要:目前还处于版本,相关文档也一直在变化,如有疏漏,还请及时反馈安装两种安装方式,或者下载包使用安装初始化项目推荐下,如果本机还没有安装,我的做法是是直接下载包假定你的工作目录是,将下载的放在下命令行进入执行如下命令,初始化一个基于的应用 yii2目前还处于beta版本,相关文档也一直在变化,如有疏漏,还请及时反馈 Yii2安装 两种安装方式,composer或者下载zip包 ...

    wuyangnju 评论0 收藏0
  • yii2实战教程之新手入门指南-简单博客管理系统

    摘要:为了演示特性的基本使用,我将会带领大家构建一个简单的博客管理系统。目前为止,我们借助生成了一系列操作。有好提示实际开发中,后台管理理应利用协助开发,可快速提高开发效果。 作者:白狼 出处:http://www.manks.top/document/easy_blog_manage_system.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出...

    harriszh 评论0 收藏0
  • Yii2系列教程七:Behaviors And Validations

    摘要:原文来自这一篇文章的开头就无需多言了,紧接着上一篇的内容和计划,这一篇我们来说说的和。,那既然这样,我们就来实现一下呗。所以我们首先需要将表中的几条数据删掉。下一节再详细讲讲吧,这一节写下来貌似要说的实在有点多。 原文来自:https://jellybool.com/post/programming-with-yii2-behaviors-and-validat... 这一篇...

    fasss 评论0 收藏0
  • Swagger PHP使用指南

    摘要:,已经好了,试着访问根目录下,比如试试,出现界面就成功了没从先就用命令看下的路由最上面条就是刚刚添加的路由。 先说什么是Swagger, Swagger的使用目的是方便优美的呈现出接口API的各种定义, 生成API文档, 包括参数, 路径之类. 有时后端改了API的参数或者其他设置, 前端直接看这个Swagger UI就可以, 方便项目管理和团队协作. 官网: http://swagg...

    cnio 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<