From 709c6d8a1dd54b0a8751b136369dba8f34451c15 Mon Sep 17 00:00:00 2001 From: Nikitin Aleksandr Date: Wed, 29 May 2024 14:18:58 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20FillIDMi?= =?UTF-8?q?nimum=5FManyPK()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/create_files/create_files.go | 32 ++++-- internal/postgres/postgres.go | 136 +++++++++++++++++++++++--- internal/postgres/postgres_test.go | 5 +- internal/types/types.go | 7 +- 4 files changed, 156 insertions(+), 24 deletions(-) diff --git a/internal/create_files/create_files.go b/internal/create_files/create_files.go index c4bc76a..fd8659e 100644 --- a/internal/create_files/create_files.go +++ b/internal/create_files/create_files.go @@ -395,11 +395,29 @@ func ReplacePrimaryKeyM_ID(Text string, Table1 *types.Table) string { func AddSkipNow(Text string, Table1 *types.Table) string { Otvet := Text - if Table1.IDMinimum == "" || Table1.IDMinimum == "0" { - TextFind := "(t *testing.T) {" - Otvet = strings.ReplaceAll(Otvet, TextFind, TextFind+"\n\tt.SkipNow() //now rows in DB\n") + Columns := FindPrimaryKeyColumns(Table1) + if Columns == nil { + return Otvet } + //проверка ИД="" + is_no_zero := true + for _, Column1 := range Columns { + if Column1.IDMinimum == "" || Column1.IDMinimum == "0" { + is_no_zero = false + break + } + } + + //если нет пустых то возврат + if is_no_zero == true { + return Otvet + } + + //добавляем t.SkipNow() + TextFind := "(t *testing.T) {" + Otvet = strings.ReplaceAll(Otvet, TextFind, TextFind+"\n\tt.SkipNow() //now rows in DB\n") + return Otvet } @@ -1945,7 +1963,7 @@ func Replace_Postgres_ID_Test(Text string, Table1 *types.Table) string { return Otvet } - IDMinimum := Table1.IDMinimum + IDMinimum := PrimaryKeyColumn.IDMinimum if IDMinimum == "" { IDMinimum = FindTextDefaultValue(PrimaryKeyColumn.TypeGo) } @@ -1953,7 +1971,7 @@ func Replace_Postgres_ID_Test(Text string, Table1 *types.Table) string { switch PrimaryKeyColumn.TypeGo { case "uuid.UUID": { - if Table1.IDMinimum == "" { + if PrimaryKeyColumn.IDMinimum == "" { Otvet = strings.ReplaceAll(Otvet, TextFind, `var Postgres_ID_Test = `+IDMinimum+``) } else { Otvet = strings.ReplaceAll(Otvet, TextFind, `var Postgres_ID_Test, _ = uuid.Parse("`+IDMinimum+`")`) @@ -1984,7 +2002,7 @@ func Replace_Model_ID_Test(Text string, Table1 *types.Table) string { return Otvet } - IDMinimum := Table1.IDMinimum + IDMinimum := PrimaryKeyColumn.IDMinimum if IDMinimum == "" { IDMinimum = FindTextDefaultValue(PrimaryKeyColumn.TypeGo) } @@ -1993,7 +2011,7 @@ func Replace_Model_ID_Test(Text string, Table1 *types.Table) string { switch PrimaryKeyColumn.TypeGo { case "uuid.UUID": { - if Table1.IDMinimum == "" { + if PrimaryKeyColumn.IDMinimum == "" { Otvet = strings.ReplaceAll(Otvet, TextFind, `var `+ModelName+`_ID_Test = `+IDMinimum+``) } else { Otvet = strings.ReplaceAll(Otvet, TextFind, `var `+ModelName+`_ID_Test, _ = uuid.Parse("`+IDMinimum+`")`) diff --git a/internal/postgres/postgres.go b/internal/postgres/postgres.go index e76c1db..ee748f9 100644 --- a/internal/postgres/postgres.go +++ b/internal/postgres/postgres.go @@ -45,7 +45,8 @@ func FillMapTable() (map[string]*types.Table, error) { return MapTable, err } - err = FillIDMinimum(MapTable) + err = FillIDMinimum_ManyPK(MapTable) + //err = FillIDMinimum(MapTable) if err != nil { log.Error("FillIDMinimum() error: ", err) return MapTable, err @@ -398,7 +399,6 @@ func FillIDMinimum(MapTable map[string]*types.Table) error { } var IDMinimum sql.NullString - //TableRows := TableRowsStruct{} tx = tx.Scan(&IDMinimum) err = tx.Error if err != nil { @@ -406,16 +406,128 @@ func FillIDMinimum(MapTable map[string]*types.Table) error { } // - Table1.IDMinimum = IDMinimum.String - //if TypeGo == "string" || TypeGo == "uuid.UUID" { - // Table1.IDMinimum = IDMinimum.String - //} else if mini_func.IsNumberType(TypeGo) == true { - // Table1.IDMinimum = IDMinimum.String - //} else if TypeGo == "time.Time" { - // Table1.IDMinimum = IDMinimum.String - //} else { - // Table1.IDMinimum = IDMinimum.String - //} + ColumnPK := create_files.FindPrimaryKeyColumn(Table1) + ColumnPK.IDMinimum = IDMinimum.String + } + + return err +} + +// FillIDMinimum_ManyPK - находим минимальный ID, для тестов с этим ID, для многих Primary Key +func FillIDMinimum_ManyPK(MapTable map[string]*types.Table) error { + var err error + + //соединение + db := postgres_gorm.GetConnection() + ctxMain := contextmain.GetContext() + + Schema := strings.Trim(postgres_gorm.Settings.DB_SCHEMA, " ") + + for TableName, Table1 := range MapTable { + ColumnsPK := create_files.FindPrimaryKeyColumns(Table1) + + Is_UUID_Type := false + for _, Column1 := range ColumnsPK { + Is_UUID_Type1 := create_files.Is_UUID_Type(Column1.TypeGo) + Is_UUID_Type = Is_UUID_Type || Is_UUID_Type1 + } + + //текст запроса + TextSQL := "" + if Is_UUID_Type == false { + TextSQL = `SELECT + ` + Comma := "" + for _, Column1 := range ColumnsPK { + TextSQL += Comma + `Min("` + Column1.Name + `") as "` + Column1.Name + `"` + Comma = "," + } + + TextSQL = TextSQL + ` + FROM + "` + Schema + `"."` + TableName + `" + WHERE 1=1` + + for _, Column1 := range ColumnsPK { + DefaultValueSQL := create_files.FindTextDefaultValueSQL(Column1.TypeGo) + TextSQL += `and ` + Column1.Name + ` <> ` + DefaultValueSQL + } + } else { + TextSQL = `SELECT + ` + Comma := "" + for _, Column1 := range ColumnsPK { + TextSQL += Comma + `"` + Column1.Name + `" as "` + Column1.Name + `"` + Comma = "," + } + + TextSQL = TextSQL + ` + FROM + "` + Schema + `"."` + TableName + `" + WHERE 1=1` + + for _, Column1 := range ColumnsPK { + TextSQL += `and ` + Column1.Name + ` is not null ` + } + TextSQL = TextSQL + ` + ORDER BY +` + Comma = "" + for _, Column1 := range ColumnsPK { + TextSQL += Comma + `"` + Column1.Name + `"` + Comma = "," + } + //TextSQL = `SELECT "` + NameID + `" as id_minimum + // FROM "` + Schema + `"."` + TableName + `" + // WHERE "` + NameID + `" is not null + // ORDER BY ` + NameID + ` + // LIMIT 1` + } + ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*60) + defer ctxCancelFunc() + db.WithContext(ctx) + + //запрос с разным количеством колонок + tx := db.Raw(TextSQL) + err = tx.Error + if err != nil { + log.Panic("Raw() Wrong SQL query: ", TextSQL, " error: ", err) + } + + rows, err := tx.Rows() + if err != nil { + log.Panic("Rows() Wrong SQL query: ", TextSQL, " error: ", err) + } + has_next := rows.Next() + if has_next == false { + log.Panic("Next() Wrong SQL query: ", TextSQL, " error: ", err) + } + ColumnsGorm, err := rows.Columns() + + MapIDMinimum := make(map[string]string) + + values := make([]interface{}, len(ColumnsGorm)) + for i := range values { + values[i] = new(interface{}) + } + if err := rows.Scan(values...); err != nil { + return err + } + + for i, colName := range ColumnsGorm { + value1 := "" + value1 = fmt.Sprint(*values[i].(*interface{})) + if value1 == "" { + value1 = "" + } + MapIDMinimum[colName] = value1 + } + + // + for _, Column1 := range ColumnsPK { + value := MapIDMinimum[Column1.Name] + Column1.IDMinimum = value + } } return err diff --git a/internal/postgres/postgres_test.go b/internal/postgres/postgres_test.go index f8cd2fa..81a9df9 100644 --- a/internal/postgres/postgres_test.go +++ b/internal/postgres/postgres_test.go @@ -1,13 +1,14 @@ package postgres import ( - ConfigMain "github.com/ManyakRus/starter/config_main" + "github.com/ManyakRus/crud_generator/internal/config" "github.com/ManyakRus/starter/postgres_gorm" "testing" ) func TestFillMassTable(t *testing.T) { - ConfigMain.LoadEnv() + //ConfigMain.LoadEnv() + config.LoadSettingsTxt() postgres_gorm.Connect() defer postgres_gorm.CloseConnection() diff --git a/internal/types/types.go b/internal/types/types.go index 7180d96..a5aaf98 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -12,6 +12,7 @@ type Column struct { NameGo string `gorm:-` TypeGo string `gorm:-` IsPrimaryKey bool `json:"is_primary_key" gorm:"column:is_primary_key;default:false"` + IDMinimum string } type Table struct { @@ -19,9 +20,9 @@ type Table struct { //Element *etree.Element MapColumns map[string]*Column //Columns []Column - OrderNumber int - NameGo string - IDMinimum string + OrderNumber int + NameGo string + //IDMinimum string Comment string `json:"table_comment" gorm:"column:table_comment;default:''"` RowsCount int64 PrimaryKeyColumnsCount int