phparrot/parrot
Composer 安装命令:
composer create-project phparrot/parrot
包简介
Rule-based generation of fixture databases by sampling operational databases. Forked from maple-syrup-group/dbsampler
README 文档
README
A general tool for extracting and cleaning selected tables from a database for use as fixtures. Copies a subset of tables from one database to another under the control of a json configuration file. The latter database can then be dumped to SQL for use as a fixture file.
Why PHParrot?
When we visited our nan at weekends as kids, my brother and I would wait until all the adults were out of the room and then endlessly repeat all the (admittedly very mild) swear words we knew at her pet parrot, in the hope that it would copy us.
As this tool copies (parrots) text from one place to another (and because this seemed like a perfect opportunity to give a project one of those names with 'PHP' stuffed into it), 'PHParrot' kind-of seemed appropriate.
Aside: Nan's parrot never repeated any words we tried teaching it, but it had learned to belch (my uncle's influence).
Usage
- Create the target database(s) you wish to fill. The tool will only output to existing databases. The content of the Destination Databases will be trashed.
- Create
config/credentials.jsonwith the DB server configuration. - Create
config/*.db.jsonfiles to define mappings for each required database - Run
bin/dbsampler.php
Configuration formats
All config files live in the config subdirectory. Files cannot contain comments as the JSON format does not support this, but as a convention, fields called "comment" will be ignored where possible.
credentials.json
"driver": "pdo_mysql" is currently assumed but this may change in future.
MySQL
See config/credentials.dist.json:
{
"driver": "pdo_mysql",
"dbUser": "root",
"dbPassword": "SOMEPASSWORD",
"dbHost": "127.0.0.1"
}
If you need different source and dest servers, this becomes:
{
"source": {
"driver": "pdo_mysql",
"dbUser": "root",
"dbPassword": "SOMEPASSWORD",
"dbHost": "sourceDB.example.com"
},
"dest" : {
"driver": "pdo_mysql",
"dbUser": "root",
"dbPassword": "SOMEPASSWORD",
"dbHost": "127.0.0.1"
}
}
If you need to prepare the connections, add an initialSql stanza:
{
"source": {
"driver": "pdo_mysql",
"dbUser": "root",
"dbPassword": "SOMEPASSWORD",
"dbHost": "sourceDB.example.com",
"initialSql": [
"SET NAMES UTF8"
]
},
"dest": {
"driver": "pdo_mysql",
"dbUser": "root",
"dbPassword": "SOMEPASSWORD",
"dbHost": "127.0.0.1",
"initialSql": [
"SET NAMES UTF8",
"SET foreign_key_checks = 0"
]
}
}
Sqlite
See config/credentials.dist.json:
{
"driver": "pdo_sqlite",
"directory": "..\/path\/to\/sqlite-dbs"
}
Paths are assumed to be relative to the config file unless they start with a '/'. Sqlite databases to be migrated are
assumed to be *.sqlite files in this directory
dbname.db.json
{
"name": "small-sqlite-test", # Configuration name
"sourceDb": "small-source", # Name of the source DB
"destDb": "small-dest", # Name of the destination DB. This DB will get trashed
"tables": { # A set of tables to be copied over. Each table is defined as "table": config
# Every config stanza requires a sampler field. For now, look these up in
# \PHParrot\Parrot\MigrationConfigProcessor::$samplerMap
# All other fields depend on the specific sampler being used; these should
# all be documented in their own class files in src/Sample
"fruits": {
"sampler": "matched",
"constraints": {
"name": [
"apple",
"pear"
]
},
"remember": {
"id": "fruit_ids" # Cross-referencing is supported by "remember" stanzas
# These take the field name of which the values are to be remembered
# matched to a variable name in which the values will be stored
# Note: Variable declarations do not include a '$' symbol
# References MUST be 'remember'ed before being used, there is no
} # dependency resolution here, so order your config appropriately
},
"vegetables": {
"sampler": "NewestById",
"idField": "id",
"quantity": 2
},
"fruit_x_basket": {
"sampler": "matched",
"constraints": {
"fruit_id": "$fruit_ids" # Remembered variables, with $ sign, can be used as cross-references
# This will expand to all ids of the fruits table matched above
},
"where" : [
"basket_id > 1" # The matched sampler can also accept a list of arbitrary WHERE clauses
],
"remember": {
"basket_id": "basket_ids"
}
},
"baskets": {
"sampler": "matched", # samplers support field cleaners that are defined in
# \PHParrot\Parrot\FieldCleanerProvider::getCleanerByName
# They modify or replace the content of the field that they are keyed to
"constraints": {
"id": "$basket_ids"
},
"cleanFields": {
"name": "fakefullname"
}
}
},
"views": [ # view support is experimental
"some_view" # views are specified as name only but format may change
] # The destination's CURRENT_USER() is used as the DEFINER for MySQL DBs
}
"Faker" cleaners
Any 'faker' (fzaninotto/faker) generator that does not require parameters can be
used directly in the cleanFields stanza by using "name": "faker:GENERATOR", eg:
"cleanFields": {
"ip": "faker:ipv4"
},
Extending the project
The tool is designed to be extended primarily by adding custom Samplers (which must implement \PHParrot\Parrot\Sampler\Sampler)
and cleaners (which must implement \PHParrot\Parrot\Cleaner\FieldCleaner ànd be registered with \PHParrot\Parrot\Cleaner\RowCleaner::registerCleaner).
Currently, only mysql and sqlite databases are supported, but this could also be extended.
This tool does not convert between database drivers. This means that if your source database is MySQL, then the destination database must also be MySQL.
phparrot/parrot 适用场景与选型建议
phparrot/parrot 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 9 次下载、GitHub Stars 达 0, 最近一次更新时间为 2021 年 02 月 09 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 phparrot/parrot 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 phparrot/parrot 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 9
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 11
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2021-02-09