hwalde / database2code
Requires
- php: ^7.0
- ext-pdo_mysql: *
- ext-simplexml: *
- ext-spl: *
- ulrichsg/getopt-php: ^3.0
Requires (Dev)
- phpunit/phpunit: ^6.0
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)
- 创建一个包含连接信息的类
Input/PostgreSQL/PostgreSQLInputConfig.php
,该类实现了Input/InputConfig
。由于在这种情况下是 PostgreSQL,您可能需要从MySQLInputConfig.php
复制 99% 的内容。 - 创建一个实现
DBMSGatewayInterface
的Input/PostgreSQL/PostgreSQLInput.php
类。 - 将新 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) . '"!'); }
- 将其添加到
Console/Application.php
- 在 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" 更改为其他名称。通常这意味着在数据库中更改它,然后重新编写项目中使用该名称的所有源文件。希望您没有错过任何部分。或者,您可以改用搜索和替换。但使用通用名称只会导致灾难。
这不必是这样!
使用对象而不是字符串...
- 您已经成功将代码库与数据库中的实际名称解耦,并通过更改模型而不是代码库来更改使用的名称。(更改一个文件而不是多个文件。)
- 您可以使用IDE的“重构->重命名”功能,使您的代码再次看起来很美观。您可以在任何需要的时候轻松提高代码的可读性。每当您想知道列的实际名称时,您只需将光标悬停在它上面。然后,您的IDE就会显示出来。