?通用扩展数据迁移器( uxdm )
uxdm可帮助开发人员将数据从一个系统或格式迁移到另一个系统。
安装
可以使用作曲家轻松安装uxdm 。只需从项目的根部运行以下命令即可。
composer require divineomega/ uxdm
如果您以前从未使用过Composer Dependency Manager,请前往Commater网站,以获取有关如何开始的更多信息。
快速开始
-
创建一个新的PHP文件以包含您的uxdm迁移代码。在此示例中,我们将其称为
user-csv-import.php。请记住要添加require 'vendor/autoload.php'和相关use语句(如有必要)。 -
创建您的源和目标对象。此示例使用CSV源和PDO(数据库)目标。
$ csvSource = new CSVSource ( \' users.csv \' ); $ pdoDestination = new PDODestination ( new PDO ( \' mysql:dbname=test-database;host=127.0.0.1 \' , \' root \' , \' password \' ), \' users \' );
- 创建并配置新的uxdm迁移器对象。
$ migrator = new Migrator ; $ migrator -> setSource ( $ csvSource ) -> setDestination ( $ pdoDestination ) -> setFieldsToMigrate ([ \' id \' , \' email \' , \' name \' ]) -> setKeyFields ([ \' id \' ]) -> withProgressBar () -> migrate ();
- 运行您新创建的迁移。在此示例中,我们可以从命令行中运行
php user-csv-import.php,并获得一个不错的进度栏。
有关可用来源和目标对象以及更高级用法的更多信息,请参见下面的部分。
迁移
每个uxdm迁移都需要一个源对象和至少一个目标对象。这些决定了读取和编写数据的位置和方式。 uxdm软件包可与各种来源和目标对象一起使用,包括以下内容。
- PDO(PHP数据库对象)源和目标
- 雄辩(在Laravel中使用)来源和目的地
- 学说(在Symfony中使用)目的地
- CSV(逗号分隔值)源和目的地
- Excel源和目的地
- 关联阵列源和目的地
- JSON文件源和目的地
- XML源和目的地
- WordPress帖子源
- WordPress用户源
- 调试输出目的地
其中一些内置在核心uxdm软件包中,而另一些则是单独的软件包。
源和目标对象可用于任何组合。数据可以从CSV迁移并插入数据库,就像可以将数据从数据库迁移到CSV一样容易。
您还可以在同一迁移中使用类似的源和目标对象。例如, uxdm的常见用途是使用PDO源和PDO目的地将数据从一个数据库传输到另一个数据库。
请参阅“来源和目的地”页面,以获取更多资源和目的地,以及有关其使用情况的详细文档。
例子
数据库迁移的数据库
数据库uxdm迁移的基本数据库的一个示例如下所示。
$ pdoSource = new PDOSource ( new PDO ( \' mysql:dbname=old-test;host=127.0.0.1 \' , \' root \' , \' password123 \' ), \' users \' ); $ pdoDestination = new PDODestination ( new PDO ( \' mysql:dbname=new-test;host=127.0.0.1 \' , \' root \' , \' password456 \' ), \' new_users \' ); $ migrator = new Migrator ; $ migrator -> setSource ( $ pdoSource ) -> setDestination ( $ pdoDestination ) -> setFieldsToMigrate ([ \' id \' , \' email \' , \' name \' ]) -> setKeyFields ([ \' id \' ]) -> withProgressBar () -> migrate ();
此迁移将将id , email和name字段从old-test数据库中的users表移动到new-test数据库中的new_users表,从而替换了使用相同id (密钥字段)的任何现有记录。
来源数据验证
您可以使用uxdm验证源数据。如果验证通过迁移而失败,则迁移将停止,并将抛弃ValidationException 。但是,如果调用->validateBeforeMigrating() ,则将在迁移开始之前先验证所有数据行。
下面的代码显示了如何验证各个字段。
$ pdoSource = new PDOSource ( new PDO ( \' mysql:dbname=old-test;host=127.0.0.1 \' , \' root \' , \' password123 \' ), \' users \' ); $ pdoDestination = new PDODestination ( new PDO ( \' mysql:dbname=new-test;host=127.0.0.1 \' , \' root \' , \' password456 \' ), \' new_users \' ); $ migrator = new Migrator ; $ migrator -> setSource ( $ pdoSource ) -> setDestination ( $ pdoDestination ) -> setFieldsToMigrate ([ \' id \' , \' email \' , \' name \' ]) -> setValidationRules ([ \' id \' => [ new Required (), new IsNumeric ()], \' email \' => [ new Required (), new IsString (), new IsEmail ()], \' name \' => [ new Required (), new IsString ()], ]) // ->validateBeforeMigrating() -> setKeyFields ([ \' id \' ]) -> withProgressBar () -> migrate ();
此迁移将验证源数据与定义的验证规则匹配。
- “ ID”必须存在,数字。
- 必须存在“电子邮件”,字符串和正确格式的电子邮件地址。
- 必须存在“名称”和一个字符串。
uxdm使用Omega验证器软件包。有关所有可用验证规则,请参见其文档。
从源到目标的映射字段名称
此示例显示了uxdm如何从源到目标映射字段名称。
$ migrator = new Migrator ; $ migrator -> setSource ( $ pdoSource ) -> setDestination ( $ pdoDestination ) -> setFieldsToMigrate ([ \' id \' , \' email \' , \' name \' ]) -> setKeyFields ([ \' id \' ]) -> setFieldMap ([ \' name \' => \' full_name \' ]) -> withProgressBar () -> migrate ();
此迁移将将数据从源name字段移动到目标full_name字段,同时仍正常移动id和email字段。
在迁移期间转换数据行
有时,您想要从源到目的地需求转换的数据。这可能是在更改现有的数据项目,添加新数据项或删除您不需要的项目。
uxdm允许您创建一个或多个变压器对象,并将它们添加到迁移中。请参阅以下示例,示例如何使用变压器来操纵您的数据。
更改现有数据项
此示例显示了如何在迁移过程中转换现有数据项。
class NameCaseTransformer implements TransformerInterface { public function transform ( DataRow $ dataRow ): void { $ nameDataItem = $ dataRow -> getDataItemByFieldName ( \' name \' ); $ nameDataItem -> value = ucwords ( strtolower ( $ nameDataItem -> value )); } } $ migrator = new Migrator ; $ migrator -> setSource ( $ pdoSource ) -> setDestination ( $ pdoDestination ) -> setFieldsToMigrate ([ \' id \' , \' email \' , \' name \' ]) -> setKeyFields ([ \' id \' ]) -> addTransformer ( new NameCaseTransformer ()) -> withProgressBar () -> migrate ();
此迁移将确保所有名称字段都具有一致的情况。
添加数据项
此示例显示了在迁移发生时如何添加新数据项。
class AddRandomNumberTransformer implements TransformerInterface { public function transform ( DataRow & $ dataRow ): void { $ dataRow -> addDataItem ( new DataItem ( \' random_number \' , rand ( 1 , 1000 ))); } } $ migrator = new Migrator ; $ migrator -> setSource ( $ pdoSource ) -> setDestination ( $ pdoDestination ) -> setFieldsToMigrate ([ \' id \' , \' email \' , \' name \' ]) -> setKeyFields ([ \' id \' ]) -> addTransformer ( new AddRandomNumberTransformer ()) -> withProgressBar () -> migrate ();
此迁移将为每一行数据添加一个随机数,称为random_number的字段。然后,这将与其他字段一起迁移到目标数据库。
删除数据项
此示例演示了如何从数据行中删除数据项。如果您想使用其值,但实际上不将其迁移到目的地,您可能希望这样做。
class EmailToHashTransformer implements TransformerInterface { public function transform ( DataRow $ dataRow ): void { $ emailDataItem = $ dataRow -> getDataItemByFieldName ( \' email \' ); $ dataRow -> addDataItem ( new DataItem ( \' email_hash \' , md5 ( $ emailDataItem -> value ))); $ dataRow -> removeDataItem ( $ emailDataItem ); } } $ migrator = new Migrator ; $ migrator -> setSource ( $ pdoSource ) -> setDestination ( $ pdoDestination ) -> setFieldsToMigrate ([ \' id \' , \' email \' , \' name \' ]) -> setKeyFields ([ \' id \' ]) -> addTransformer ( new EmailToHashTransformer ()) -> withProgressBar () -> migrate ();
此迁移从源中的email字段中获取数据,创建一个新的email_hash数据项,其中包含电子邮件地址的MD5,然后删除原始的email数据项。然后,此新的email_hash将与其他字段一起迁移到目标数据库,不包括已删除的email字段。
