hwalde/database2code

v0.11.0-beta 2019-03-16 23:21 UTC

This package is auto-updated.

Last update: 2024-09-24 23:06:02 UTC


README

Database2Code 是一个将数据库结构或单个表导出到源代码(例如 PHP)文件或其他格式的工具。

它是 jOOQ 代码生成器的 PHP 版本。

目的

您想在表和列名称上自动完成吗?就像以下 PHP 示例一样

$sql = 'SELECT '.s_core_engine_groups::variantable.' FROM '.s_core_engine_groups::class;

那么您需要一个将数据库结构导出到 PHP 代码的工具。

这个工具会为您做到这一点!

您可以使用它作为命令行程序或使用 PHP API。

安装

安装 PHP Archive (PHAR)

我们分发一个 PHP Archive (PHAR) 文件。

您可以从这里下载和使用 database2code.phar 文件 这里

$ php database2code.phar --help

使用 Composer

或者,您可以使用 Composer 下载和安装 Database2Code。

$ composer require hwalde/database2code

使用方法

命令行使用方法

转换数据库中的所有表

$ php database2code \
    --dbms='mysql' \
    --mysql-host='localhost' \
    --mysql-user='username' \ 
    --mysql-password='password' \
    'pathToOutputFolder' 'database_name'

仅转换一个表

$ php database2code \
    --dbms='mysql' \
    --mysql-host='localhost' \
    --mysql-user='username' \ 
    --mysql-password='password' \
    'pathToOutputFolder' 'database_name' 'table_name'

选项

--mysql-port [3306] MySQL 端口

--customTemplate [filePath] 使用自定义输出文件模板

--customOutputFileGateway [FQN] 可以指定自定义输出文件生成器

--xml-config-file [filePath] 从 xml 文件读取数据库配置

--output-phpversion [version] 代码将为创建的 PHP 版本。用于某些输出模板。(默认:执行解释器的版本)

--output-namespace [namespace] 命名空间信息。用于某些输出模板。

XML 数据库配置

您可以使用命令行选项设置数据库条目,也可以从 xml 文件中读取它们。只需使用 "--xml-config-file" 设置 xml 文件的路径即可。

文件格式

<?xml version="1.0" encoding="UTF-8"?>
<database>
    <type>mysql</type>
    <hostname>hostname</hostname>
    <username>the-username</username>
    <password>the-password</password>
    <port>3306</port>
</database>

端口号是可选的!文件格式可能因类型而异。

使用 PHP API

$outputConfig = new \Database2Code\Output\OutputConfig();

// Optionally set your own (or some provided) template:
$outputConfig->setCustomTemplatePath('Template/PHPFile/getterAndSetter.php');

// And in case an own template is not enough customization, then you can provide an your own output-class.
// Note: Your output-class needs to implement \Database2Code\Output\Output interface.
// The required argument is the fully qualified classname to your output-class:
$outputConfig->setCustomOutputClassname(MyOutputOutput::class);

$output = new \Database2Code\Output\OutputConfig($outputConfig);
$service = new \Database2Code\Service\ConvertService($output);

$inputConfig = new \Database2Code\Input\MySQL\MySQLInputConfig('username', 'password', 'hostname');

// Convert entire database:
$service->convertDatabase($inputConfig, 'database-name', 'output/folder/path');

// Convert single table:
$service->convertTable($inputConfig, 'database-name', 'table-name', 'output/folder/path');

扩展和自定义

添加另一个 DBMS

目前仅实现了 MySQL。但添加其他 DBMS 类型(SQLite、Oracle、...)很容易。

您只需做以下事情(假设我们要添加 PostgreSQL)

  1. 创建一个包含连接信息的类 Input/PostgreSQL/PostgreSQLInputConfig.php,该类实现了 Input/InputConfig。由于在这种情况下是 PostgreSQL,您可能需要从 MySQLInputConfig.php 复制 99% 的内容。
  2. 创建一个实现 DBMSGatewayInterfaceInput/PostgreSQL/PostgreSQLInput.php 类。
  3. 将新 DBMS 添加到 Service/ConvertService.php
    use Database2Code\Input\PostgreSQL\PostgreSQLInputConfig;
    use Database2Code\Input\PostgreSQL\PostgreSQLInput;
    
    private function generateInputInstance(InputConfig $inputConfig, string $database) : Input
    {
        if ($inputConfig instanceof MySQLInputConfig) {
            return new MySQLInput($inputConfig, $database, new MySQLTableHydrator());
        }
        if ($inputConfig instanceof PostgreSQLInputConfig) {
            return new PostgreSQLGateway($inputConfig);
        }
        throw new \Error('Unknown InputConfig "' . get_class($dbConfig) . '"!');
    }
  4. 将其添加到 Console/Application.php
  5. 在 Github 上创建一个 pull request

附录

更多关于此工具的目的

这结合数据库-API 很有用

当您已经使用自动完成功能并通过 API 访问数据库时,您会发现使用表和列名称也这样做很方便

$rows = $db->select('*')
    ->from(s_core_engine_groups::class)
    ->whereIsTrue(s_core_engine_groups::variantable)
    ->fetchAll();
    
foreach($rows as $row) {
    echo $row[s_core_engine_groups::name];   
}
如果名称更改怎么办?

现在假设您想将列名 "variantable" 更改为其他名称。通常这意味着在数据库中更改它,然后重新编写项目中使用该名称的所有源文件。希望您没有错过任何部分。或者,您可以改用搜索和替换。但使用通用名称只会导致灾难。

这不必是这样!

使用对象而不是字符串...

  1. 您已经成功将代码库与数据库中的实际名称解耦,并通过更改模型而不是代码库来更改使用的名称。(更改一个文件而不是多个文件。)
  2. 您可以使用IDE的“重构->重命名”功能,使您的代码再次看起来很美观。您可以在任何需要的时候轻松提高代码的可读性。每当您想知道列的实际名称时,您只需将光标悬停在它上面。然后,您的IDE就会显示出来。