1+ function ucFirst ( val ) {
2+ return val . charAt ( 0 ) . toUpperCase ( ) + val . slice ( 1 ) ;
3+ }
4+
5+ function dbNameToCamelCase ( name ) {
6+ const row = [ ] ;
7+ const re = name . split ( '_' ) ;
8+ re . map ( ( val ) => {
9+ row . push ( ucFirst ( val ) ) ;
10+ } ) ;
11+ return row . join ( '' ) ;
12+ }
13+
14+ function containStr ( name , val ) {
15+ if ( name . indexOf ( val ) >= 0 ) {
16+ return true ;
17+ }
18+ return false ;
19+ }
20+
21+ function sqlTypeToGoType ( type ) {
22+ let isContainUsign = false ;
23+ if ( containStr ( type , 'unsigned' ) ) {
24+ isContainUsign = true ;
25+ }
26+ if ( containStr ( type , 'varchar' ) ) {
27+ return 'string' ;
28+ }
29+ if ( containStr ( type , 'int' ) ) {
30+ if ( ! isContainUsign ) {
31+ return 'int64' ;
32+ }
33+ return 'uint64' ;
34+ }
35+ return 'unknown' ;
36+ }
37+
38+ function sqlToModel ( data ) {
39+ const dbName = data . tableName ;
40+ const dbNameStr = dbNameToCamelCase ( dbName ) ;
41+ const packageName = 'db' ;
42+ const importPackages = [ 'context' ,
43+ 'github.com/jinzhu/gorm' ,
44+ 'pkg.poizon.com/golang/go-common/mysql' ] ;
45+ let importPackageStr = '' ;
46+ importPackages . map ( ( val ) => {
47+ importPackageStr += `"${ val } "\n` ;
48+ } ) ;
49+ let columsStr = '' ;
50+ data . columns . map ( ( val ) => {
51+ let defaultStr = '' ;
52+ if ( val . default !== undefined && val . default !== 'NULL' ) {
53+ defaultStr = `;default:${ val . default } ` ;
54+ }
55+ columsStr += ` ${ dbNameToCamelCase ( val . name ) } ${ sqlTypeToGoType ( val . type ) } \`gorm:"column:${ val . name } ${ defaultStr } " json:"${ val . name } "\`\n` ;
56+ } ) ;
57+ const resultStr = `
58+ package ${ packageName }
59+ import (
60+ ${ importPackageStr }
61+ )
62+ var New${ dbNameStr } ${ dbNameStr } Model
63+ type ${ dbNameStr } Model struct {
64+ ${ columsStr }
65+ }
66+ func (*${ dbNameStr } Model) TableName() string {
67+ return "${ dbName } "
68+ }
69+ ` ;
70+ console . log ( resultStr ) ;
71+ return resultStr ;
72+ }
73+
74+ // 解析sql表明等基础信息
175function sqlStrToGoTemplate ( str ) {
276 // CREATE TABLE `(.*)`\s\(([\d\D]*)\)\sENGINE=(.*)\sAUTO_INCREMENT=(\d+)\s(\w+)\sCHARSET=(\w+)\s(COLLATE=\w+)*
377 const regex = / C R E A T E T A B L E ` ( .* ) ` \s \( ( [ \d \D ] * ) \) \s E N G I N E = ( .* ) \s A U T O _ I N C R E M E N T = ( \d + ) \s ( \w + ) \s C H A R S E T = ( \w + ) \s ( C O L L A T E = \w + ) * / gm;
@@ -19,14 +93,16 @@ function sqlStrToGoTemplate(str) {
1993 return sqlStrColumnToEachColumn ( data ) ;
2094}
2195
96+ // 解析sql每个字段
2297function sqlStrColumnToEachColumn ( data ) {
2398 const regex = / ` ( .* ) ` \s ( \w + [ \( ( \d + ) \) ] * [ \s u n s i g n e d \s ] * ) ( [ N O T \s [ N U L L \s ] * ] * ) ( D E F A U L T \s ( [ \' ] ( .* ?) [ \' ] | N U L L ) \s ) * ( A U T O _ I N C R E M E N T \s ) * ( C O M M E N T \s [ \' ] ( .* ) [ \' ] ) * / gm;
24- console . log ( data ) ;
25- const tableName = data [ 1 ] ;
99+ const tableInfo = {
100+ tableName : data [ 1 ] ,
101+ engine : data [ 3 ] ,
102+ increasement : data [ 4 ] ,
103+ dafaultCharset : data [ 6 ] ,
104+ } ;
26105 const str = data [ 2 ] ;
27- const engine = data [ 3 ] ;
28- const incrasement = data [ 4 ] ;
29- const dafaultCharset = data [ 6 ] ;
30106 const columns = [ ] ;
31107 let m ;
32108 while ( ( m = regex . exec ( str ) ) !== null ) {
@@ -41,10 +117,20 @@ function sqlStrColumnToEachColumn(data) {
41117 } ) ;
42118 columns . push ( one ) ;
43119 }
44- console . log ( columns ) ;
120+ const columnData = [ ] ;
121+ columns . map ( ( column ) => {
122+ columnData . push ( {
123+ name : column [ 1 ] , type : column [ 2 ] , default : column [ 6 ] , comment : column [ 9 ] ,
124+ } ) ;
125+ } ) ;
126+ tableInfo . columns = columnData ;
127+ return sqlToModel ( tableInfo ) ;
45128}
46129
47130export {
48131 sqlStrToGoTemplate ,
49132 sqlStrColumnToEachColumn ,
133+ sqlToModel ,
134+ ucFirst ,
135+ sqlTypeToGoType ,
50136} ;
0 commit comments