提交 a86ed69f 编写于 作者: aaronchen2k2k's avatar aaronchen2k2k

fix issues

上级 98fd9588
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/easysoft/zendata/cmd/test/comm"
"github.com/easysoft/zendata/cmd/test/model"
fileUtils "github.com/easysoft/zendata/pkg/utils/file"
"path/filepath"
"reflect"
)
func main() {
filePath := "data/animal_plant/v1.xlsx"
sheetName := "animal_plant"
fileUtils.MkDirIfNeeded(filepath.Dir(filePath))
db := comm.GetDB()
db.AutoMigrate(
&model.DataXiehouyu{},
)
pos := make([]model.DataAnimalPlant, 0)
db.Where("NOT deleted").Find(&pos)
f := excelize.NewFile()
index := f.NewSheet(sheetName)
f.SetActiveSheet(index)
sheet1 := f.GetSheetName(0)
f.DeleteSheet(sheet1)
var infos []model.TableInfo
db.Raw("desc " + model.DataAnimalPlant{}.TableName()).Scan(&infos)
excelColNameArr, excelColNameHeader := comm.GetExcelColsByTableDef(infos)
fieldNames := comm.GetStructFields(model.DataAnimalPlant{})
// gen headers
for index, name := range excelColNameHeader {
excelColName := excelColNameArr[index]
excelColId := fmt.Sprintf("%s%d", excelColName, 1)
f.SetCellValue(sheetName, excelColId, name)
}
// gen rows
for rowIndex, po := range pos {
for fieldIndex, fieldName := range fieldNames {
val := ""
if fieldName == "Id" {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Uint())
} else if reflect.ValueOf(po).FieldByName(fieldName).Kind() == reflect.Int {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Int())
} else {
val = reflect.ValueOf(po).FieldByName(fieldName).String()
}
excelColName := excelColNameArr[fieldIndex]
excelColId := fmt.Sprintf("%s%d", excelColName, rowIndex+2)
f.SetCellValue(sheetName, excelColId, val)
}
}
f.SaveAs(filePath)
}
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/easysoft/zendata/cmd/test/comm"
"github.com/easysoft/zendata/cmd/test/model"
fileUtils "github.com/easysoft/zendata/pkg/utils/file"
"path/filepath"
"reflect"
)
func main() {
filePath := "data/food/v1.xlsx"
sheetName := "food"
fileUtils.MkDirIfNeeded(filepath.Dir(filePath))
db := comm.GetDB()
db.AutoMigrate(
&model.DataFood{},
)
pos := make([]model.DataFood, 0)
db.Where("NOT deleted").Find(&pos)
f := excelize.NewFile()
index := f.NewSheet(sheetName)
f.SetActiveSheet(index)
sheet1 := f.GetSheetName(0)
f.DeleteSheet(sheet1)
var infos []model.TableInfo
db.Raw("desc " + model.DataFood{}.TableName()).Scan(&infos)
excelColNameArr, excelColNameHeader := comm.GetExcelColsByTableDef(infos)
fieldNames := comm.GetStructFields(model.DataFood{})
// gen headers
for index, name := range excelColNameHeader {
excelColName := excelColNameArr[index]
excelColId := fmt.Sprintf("%s%d", excelColName, 1)
f.SetCellValue(sheetName, excelColId, name)
}
// gen rows
for rowIndex, po := range pos {
for fieldIndex, fieldName := range fieldNames {
val := ""
if fieldName == "Id" {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Uint())
} else if reflect.ValueOf(po).FieldByName(fieldName).Kind() == reflect.Int {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Int())
} else {
val = reflect.ValueOf(po).FieldByName(fieldName).String()
}
excelColName := excelColNameArr[fieldIndex]
excelColId := fmt.Sprintf("%s%d", excelColName, rowIndex+2)
f.SetCellValue(sheetName, excelColId, val)
}
}
f.SaveAs(filePath)
}
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/easysoft/zendata/cmd/test/comm"
"github.com/easysoft/zendata/cmd/test/model"
fileUtils "github.com/easysoft/zendata/pkg/utils/file"
"path/filepath"
"reflect"
)
func main() {
filePath := "data/fruit/v1.xlsx"
sheetName := "fruit"
fileUtils.MkDirIfNeeded(filepath.Dir(filePath))
db := comm.GetDB()
db.AutoMigrate(
&model.DataFruit{},
)
pos := make([]model.DataFruit, 0)
db.Where("NOT deleted").Find(&pos)
f := excelize.NewFile()
index := f.NewSheet(sheetName)
f.SetActiveSheet(index)
sheet1 := f.GetSheetName(0)
f.DeleteSheet(sheet1)
var infos []model.TableInfo
db.Raw("desc " + model.DataFruit{}.TableName()).Scan(&infos)
excelColNameArr, excelColNameHeader := comm.GetExcelColsByTableDef(infos)
fieldNames := comm.GetStructFields(model.DataFruit{})
// gen headers
for index, name := range excelColNameHeader {
excelColName := excelColNameArr[index]
excelColId := fmt.Sprintf("%s%d", excelColName, 1)
f.SetCellValue(sheetName, excelColId, name)
}
// gen rows
for rowIndex, po := range pos {
for fieldIndex, fieldName := range fieldNames {
val := ""
if fieldName == "Id" {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Uint())
} else if reflect.ValueOf(po).FieldByName(fieldName).Kind() == reflect.Int {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Int())
} else {
val = reflect.ValueOf(po).FieldByName(fieldName).String()
}
excelColName := excelColNameArr[fieldIndex]
excelColId := fmt.Sprintf("%s%d", excelColName, rowIndex+2)
f.SetCellValue(sheetName, excelColId, val)
}
}
f.SaveAs(filePath)
}
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/easysoft/zendata/cmd/test/comm"
"github.com/easysoft/zendata/cmd/test/model"
fileUtils "github.com/easysoft/zendata/pkg/utils/file"
"path/filepath"
"reflect"
)
func main() {
filePath := "data/joke/v1.xlsx"
sheetName := "joke"
fileUtils.MkDirIfNeeded(filepath.Dir(filePath))
db := comm.GetDB()
db.AutoMigrate(
&model.Joke{},
)
pos := make([]model.Joke, 0)
db.Where("NOT deleted").Find(&pos)
f := excelize.NewFile()
index := f.NewSheet(sheetName)
f.SetActiveSheet(index)
sheet1 := f.GetSheetName(0)
f.DeleteSheet(sheet1)
var infos []model.TableInfo
db.Raw("desc " + model.Joke{}.TableName()).Scan(&infos)
excelColNameArr, excelColNameHeader := comm.GetExcelColsByTableDef(infos)
fieldNames := comm.GetStructFields(model.Joke{})
// gen headers
for index, name := range excelColNameHeader {
excelColName := excelColNameArr[index]
excelColId := fmt.Sprintf("%s%d", excelColName, 1)
f.SetCellValue(sheetName, excelColId, name)
}
// gen rows
for rowIndex, po := range pos {
for fieldIndex, fieldName := range fieldNames {
val := ""
if fieldName == "Id" {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Uint())
} else if reflect.ValueOf(po).FieldByName(fieldName).Kind() == reflect.Int {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Int())
} else {
val = reflect.ValueOf(po).FieldByName(fieldName).String()
}
excelColName := excelColNameArr[fieldIndex]
excelColId := fmt.Sprintf("%s%d", excelColName, rowIndex+2)
f.SetCellValue(sheetName, excelColId, val)
}
}
f.SaveAs(filePath)
}
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/easysoft/zendata/cmd/test/comm"
"github.com/easysoft/zendata/cmd/test/model"
fileUtils "github.com/easysoft/zendata/pkg/utils/file"
"path/filepath"
"reflect"
)
func main() {
filePath := "data/poetry_ancient/v1.xlsx"
sheetName := "poetry_ancient"
fileUtils.MkDirIfNeeded(filepath.Dir(filePath))
db := comm.GetDB()
db.AutoMigrate(
&model.PoetryAncient{},
)
pos := make([]model.PoetryAncient, 0)
db.Where("NOT deleted").Find(&pos)
f := excelize.NewFile()
index := f.NewSheet(sheetName)
f.SetActiveSheet(index)
sheet1 := f.GetSheetName(0)
f.DeleteSheet(sheet1)
var infos []model.TableInfo
db.Raw("desc " + model.PoetryAncient{}.TableName()).Scan(&infos)
excelColNameArr, excelColNameHeader := comm.GetExcelColsByTableDef(infos)
fieldNames := comm.GetStructFields(model.PoetryAncient{})
// gen headers
for index, name := range excelColNameHeader {
excelColName := excelColNameArr[index]
excelColId := fmt.Sprintf("%s%d", excelColName, 1)
f.SetCellValue(sheetName, excelColId, name)
}
// gen rows
for rowIndex, po := range pos {
for fieldIndex, fieldName := range fieldNames {
val := ""
kind := reflect.ValueOf(po).FieldByName(fieldName).Kind()
if fieldName == "Id" {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Uint())
} else if kind == reflect.Int {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Int())
} else if kind == reflect.Uint {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Uint())
} else {
val = fmt.Sprintf("%v", reflect.ValueOf(po).FieldByName(fieldName))
}
excelColName := excelColNameArr[fieldIndex]
excelColId := fmt.Sprintf("%s%d", excelColName, rowIndex+2)
f.SetCellValue(sheetName, excelColId, val)
}
}
f.SaveAs(filePath)
}
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/easysoft/zendata/cmd/test/comm"
"github.com/easysoft/zendata/cmd/test/model"
fileUtils "github.com/easysoft/zendata/pkg/utils/file"
"path/filepath"
"reflect"
)
func main() {
filePath := "data/song/v1.xlsx"
sheetName := "song"
fileUtils.MkDirIfNeeded(filepath.Dir(filePath))
db := comm.GetDB()
db.AutoMigrate(
&model.Song{},
)
pos := make([]model.Song, 0)
db.Where("NOT deleted").Find(&pos)
f := excelize.NewFile()
index := f.NewSheet(sheetName)
f.SetActiveSheet(index)
sheet1 := f.GetSheetName(0)
f.DeleteSheet(sheet1)
var infos []model.TableInfo
db.Raw("desc " + model.Song{}.TableName()).Scan(&infos)
excelColNameArr, excelColNameHeader := comm.GetExcelColsByTableDef(infos)
fieldNames := comm.GetStructFields(model.Song{})
// gen headers
for index, name := range excelColNameHeader {
excelColName := excelColNameArr[index]
excelColId := fmt.Sprintf("%s%d", excelColName, 1)
f.SetCellValue(sheetName, excelColId, name)
}
// gen rows
for rowIndex, po := range pos {
for fieldIndex, fieldName := range fieldNames {
val := ""
if fieldName == "Id" {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Uint())
} else if reflect.ValueOf(po).FieldByName(fieldName).Kind() == reflect.Int {
val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Int())
} else {
val = reflect.ValueOf(po).FieldByName(fieldName).String()
}
excelColName := excelColNameArr[fieldIndex]
excelColId := fmt.Sprintf("%s%d", excelColName, rowIndex+2)
f.SetCellValue(sheetName, excelColId, val)
}
}
f.SaveAs(filePath)
}
......@@ -10,26 +10,23 @@ Parameters:
-n --lines The number of lines of data to be generated. The default is 10.
-F --field This parameter can be used to specify the fields, separated by commas. The default is all fields.
-t --table If the output format is sql, using it to specify the table name to insert data to.
--dsn Specify MySQL\SqlServer\Oracle data source connection string, used to insert data to table directly.
--clear Remove data in MySQL table before insert.
-T --trim Remove the prefix and postfix of every field when outputting data or decode data to json string.
-H --human Output a readable format, print the field name, and use the tab key to split.
-r --recursive Recursive mode. The default mode is parallel, in which each field loops independently.
The value of a field in the recursive mode depends on that of the previous field, which enables the random data.
-p --port Run the HTTP on the specified port. The data in JSON format can be obtained via http:\\ip\ port.
Only data generation is supported.
-b --bind Listen IP addresses. All IP addresses are listened by default.
-t --table If the output format is sql, using it to specify the table name to insert data to.
--dsn Specify MySQL, SqlServer or Oracle data source connection string, used to insert data to table directly.
--clear Remove data in MySQL table before insert.
-s Run HTTP service for data administration and generation.
-p --port Specify the port of HTTP service.
-R --root The root directory when generate data OR running HTTP. The client can call the config file under the root directory.
If not specified, take the directory where the zd executable file is located.
-i --input Specify a sql schema OR article text file, used to generate YAML config file for it.
--parse Specify a dsn, sql schema OR article text file, used to generate YAML config file for it.
You need to specify an output directory by using -o.
-D --decode Referring to the specified configuration file, parse the data file specified by -i and output json.
Also you can output the readable format via -H.
-a --article Convert article to yaml config file in the dir provided by -o parameter.
-i --input Specify a Schema(.sql)OR Article(.txt)file to parse.
-l --list List user's data in current dir.
-L List build-in data in ZenData install dir.
......@@ -51,9 +48,10 @@ $>zd.exe -d demo\default.yaml -n 100 -o test.sql -t user # Output th
$>zd.exe -d demo\default.yaml -o test.sql -t user -s mysql --trim # Remove the prefix and postfix of every field.
$>zd.exe -c test\test-sql.yaml -t zendata.table_a --trim -dns mysql://root:P2ssw0rd@127.0.0.1:3306/zendata#utf8 --clear # Insert data to MySQL table.
$>zd.exe -i demo\zentao.sql -o db # Generate YAML files for each table by parsing zentao.sql.
$>zd.exe -i demo\article.txt -o demo # Convert article text to yaml config file in demo dir.
$>zd.exe -c demo\default.yaml -i test.txt --decode # Parse the file specified by -i according to the config of -d.
$>zd.exe -parse -i demo\zentao.sql -o db # Generate YAML files for each table by parsing zentao.sql.
$>zd.exe -parse -i demo\article.txt -o demo # Convert article text to yaml config file in demo dir.
$>zd.exe -parse -dsn root:P2ssw0rd@(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local -table table1 -o db
# Generate YAML files for given table in database.
$>zd.exe -l # List all build-in data types.
$>zd.exe -v address.cn.v1 # View data types in build-in Excel file data\address\cn.v1.xlsx.
......
......@@ -9,21 +9,21 @@ ZenData是一款通用的数据生成工具,您可以使用yaml文件来定义
-n --lines 要生成的记录条数,默认为10条。
-F --field 可通过该参数指定要输出的字段列表,用逗号分隔。 默认是所有的字段。
-t --table 输出格式为sql时,需通过该参数指定要插入数据的表名。
--dsn 指定MySQL\SqlServer\Oracle 数据源,用于直接插入数据到数据库表。
--clear 插入数据前,删除已有数据。
-T --trim 输出的字段去除前后缀,通常用在生成SQL格式输出或解析测试数据时。
-H --human 输出可读格式,打印字段名,并使用tab键进行分割。
-r --recursive 递归模式。如不指定,默认为平行模式。平行模式下各个字段独立循环。
递归模式下每个字段的取值依赖于前一字段。可增强数据的随机性。
-p --port 在指定端口上运行HTTP服务。可通过http://ip/接口获得JSON格式的数据。服务模式下只支持数据生成。
-b --bind 监听的ip地址,默认监听所有的ip地址。
-t --table 输出格式为sql时,需通过该参数指定要插入数据的表名。
--dsn 指定MySQL、SqlServer或Oracle数据源,用于直接插入数据到数据库表。
--clear 插入数据前,删除已有数据。
-s 运行数据管理和生成HTTP服务。
-p --port 指定HTTP服务端口。
-R --root 指定数据生成命令或运行HTTP服务的根目录。客户端可调用该根目录下面的配置文件。如果不指定,取zd可执行文件所在目录。
-i --input 指定一个数据库Schema或文章文本文件,解析生成yaml配置文件。需通过-o参数指定一个输出的目录。
-D --decode 根据指定的配置文件,将通过-i参数指定的数据文件解析成json格式。
-a --article 将指定的文件或目录下扩展名为.txt的文件,转换成文章yaml配置,输出到-o参数指定的目录下。
--parse 指定一个数据库连接、Schema或文章文本文件,解析生成yaml配置文件。需通过-o参数指定一个输出的目录。
-i --input 指定parse指令的的Schema(.sql)或文章(.txt)文件,用于转换成yaml配置文件。
-l --list 列出当前目录下所有的用户数据定义。
-L 列出ZenData安装目录下所有数据定义。
......@@ -46,9 +46,10 @@ $>zd.exe -d demo\default.yaml -n 100 -o test.sql -t user # 输出针
$>zd.exe -d demo\default.yaml -n 100 -o test.sql -t user --trim # 输出针对user表的insert语句,去掉前缀和后缀。
$>zd.exe -c test\test-sql.yaml -t zendata.table_a --trim -dsn mysql://root:P2ssw0rd@127.0.0.1:3306/zendata#utf8 --clear # 插入数据到MySQL数据表。
$>zd.exe -i demo\zentao.sql -o db # 根据sql的定义生成各表的yaml文件,存储到db目录里面。
$>zd.exe -i demo\article.txt -o demo # 转换文章为yaml配置,输出到demo目录下。
$>zd.exe -c demo\default.yaml -i test.txt --decode # 将-i指定的文件根据-d参数的配置进行解析。
$>zd.exe -parse -i demo\zentao.sql -o db # 根据sql的定义生成各表的yaml文件,存储到db目录里面。
$>zd.exe -parse -i demo\article.txt -o demo # 转换文章为yaml配置,输出到demo目录下。
$>zd.exe -parse -dsn root:P2ssw0rd@(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local -table table1 -o db
# 根据指定数据库表生成yaml文件,存储到db目录里面。
$>zd.exe -l # 列出所有內置数据。
$>zd.exe -v address.cn.v1 # 查看內置Excel文件data/address/cn.v1.xlsx中的数据表。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册