Skip to content

Commit

Permalink
Merge pull request #309 from jupp0r/feature/optimize-mysql-generator-…
Browse files Browse the repository at this point in the history
…performance

Improve performance of mysql generator
  • Loading branch information
go-jet committed Feb 19, 2024
2 parents 61841dc + bffec36 commit 493d3a4
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 41 deletions.
2 changes: 1 addition & 1 deletion generator/metadata/column_meta_data.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (

// Column struct
type Column struct {
Name string
Name string `sql:"primary_key"`
IsPrimaryKey bool
IsNullable bool
IsGenerated bool
Expand Down
2 changes: 1 addition & 1 deletion generator/metadata/table_meta_data.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package metadata

// Table metadata struct
type Table struct {
Name string
Name string `sql:"primary_key"`
Columns []Column
}

Expand Down
53 changes: 14 additions & 39 deletions generator/mysql/query_set.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,42 +8,15 @@ import (

"github.com/go-jet/jet/v2/generator/metadata"
"github.com/go-jet/jet/v2/qrm"
"golang.org/x/sync/errgroup"
)

// mySqlQuerySet is dialect query set for MySQL
type mySqlQuerySet struct{}

func (m mySqlQuerySet) GetTablesMetaData(db *sql.DB, schemaName string, tableType metadata.TableType) ([]metadata.Table, error) {
query := `
SELECT table_name as "table.name"
FROM INFORMATION_SCHEMA.tables
WHERE table_schema = ? and table_type = ?
ORDER BY table_name;
`
var tables []metadata.Table

_, err := qrm.Query(context.Background(), db, query, []interface{}{schemaName, tableType}, &tables)
if err != nil {
return nil, fmt.Errorf("failed to query %s metadata result: %w", tableType, err)
}

wg := errgroup.Group{}
for i := 0; i < len(tables); i++ {
i := i
wg.Go(func() (err1 error) {
tables[i].Columns, err1 = m.GetTableColumnsMetaData(db, schemaName, tables[i].Name)
return err1
})
}

err = wg.Wait()
return tables, err
}

func (m mySqlQuerySet) GetTableColumnsMetaData(db *sql.DB, schemaName string, tableName string) ([]metadata.Column, error) {
query := `
SELECT
t.table_name as "table.name",
col.COLUMN_NAME AS "column.Name",
col.IS_NULLABLE = "YES" AS "column.IsNullable",
col.COLUMN_COMMENT AS "column.Comment",
Expand All @@ -56,30 +29,32 @@ SELECT
) AS "dataType.Name",
IF (col.DATA_TYPE = 'enum', 'enum', 'base') AS "dataType.Kind",
col.COLUMN_TYPE LIKE '%unsigned%' AS "dataType.IsUnsigned"
FROM
FROM INFORMATION_SCHEMA.tables AS t
INNER JOIN
information_schema.columns AS col
ON t.table_schema = col.table_schema AND t.table_name = col.table_name
LEFT JOIN (
SELECT k.column_name, 1 AS IsPrimaryKey
SELECT k.column_name, 1 AS IsPrimaryKey, k.table_name
FROM information_schema.table_constraints t
JOIN information_schema.key_column_usage k USING(constraint_name, table_schema, table_name)
WHERE t.table_schema = ?
AND t.table_name = ?
AND t.constraint_type = 'PRIMARY KEY'
) AS pk ON col.COLUMN_NAME = pk.column_name
WHERE
col.table_schema = ?
AND col.table_name = ?
) AS pk ON col.COLUMN_NAME = pk.column_name AND col.table_name = pk.table_name
WHERE t.table_schema = ?
AND t.table_type = ?
ORDER BY
t.table_name,
col.ordinal_position;
`

var columns []metadata.Column
_, err := qrm.Query(context.Background(), db, query, []interface{}{schemaName, tableName, schemaName, tableName}, &columns)
var tables []metadata.Table

_, err := qrm.Query(context.Background(), db, query, []interface{}{schemaName, schemaName, tableType}, &tables)
if err != nil {
return nil, fmt.Errorf("failed to query %s column meta data: %w", tableName, err)
return nil, fmt.Errorf("failed to query column meta data: %w", err)
}

return columns, nil
return tables, nil
}

func (m mySqlQuerySet) GetEnumsMetaData(db *sql.DB, schemaName string) ([]metadata.Enum, error) {
Expand Down

0 comments on commit 493d3a4

Please sign in to comment.