From 341aabd08e89c7648ed97639cc09f3f53fc9cc36 Mon Sep 17 00:00:00 2001 From: "kousuke.tanihata" Date: Sat, 12 Aug 2017 14:17:04 +0900 Subject: [PATCH 1/5] =?UTF-8?q?wip=20sql=20schema=E5=8F=96=E5=BE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 5 ---- app/controllers/app.go | 3 +++ app/service/sql/sql.go | 60 ++++++++++++++++++++++++++++++++++++++++++ main.sql | 3 +++ 4 files changed, 66 insertions(+), 5 deletions(-) delete mode 100755 .env diff --git a/.env b/.env deleted file mode 100755 index 074ffcb..0000000 --- a/.env +++ /dev/null @@ -1,5 +0,0 @@ -db=mysql -host=3306 -user=root -dbname=SASUKE_TEST -password= \ No newline at end of file diff --git a/app/controllers/app.go b/app/controllers/app.go index 0709020..97cd98d 100644 --- a/app/controllers/app.go +++ b/app/controllers/app.go @@ -2,6 +2,7 @@ package controllers import ( "github.com/revel/revel" + "sasuke/app/service/sql" ) type App struct { @@ -9,6 +10,8 @@ type App struct { } func (c App) Index() revel.Result { + s := &sql.Handler{} + s.FetchTableSchema() return c.Render() } diff --git a/app/service/sql/sql.go b/app/service/sql/sql.go index e4b317b..f943b2e 100644 --- a/app/service/sql/sql.go +++ b/app/service/sql/sql.go @@ -1 +1,61 @@ package sql + +import ( + "github.com/gocraft/dbr" + _ "github.com/go-sql-driver/mysql" + //"github.com/joho/godotenv" + //"log" + "fmt" +) + +type Handler struct { +} + +//var ( +// db string +// host string +// dbuser string +// dbname string +// password string +// port string +//) + +func (h *Handler)FetchTableSchema () { + //loadEnv(); + db := "mysql" + host :="localhost" + port := "3306" + dbuser := "root" + dbname := "SASUKE_TEST" + password := "password" + + conn, err := dbr.Open(db,dbuser+":"+password+"@tcp("+host+":"+port+")/"+dbname,nil) + if err != nil { + panic(err) + } + sess := conn.NewSession(nil) + var tables []string + sess.SelectBySql("show tables").Load(&tables) + + //var builder [][]string + //var table_columns [][]string + for i := 0;i Date: Sat, 12 Aug 2017 17:11:08 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=E4=B8=80=E6=97=A6=E3=80=80=E3=82=B3?= =?UTF-8?q?=E3=83=9F=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/sql/sql.go | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/app/service/sql/sql.go b/app/service/sql/sql.go index f943b2e..b2c4ee5 100644 --- a/app/service/sql/sql.go +++ b/app/service/sql/sql.go @@ -6,6 +6,8 @@ import ( //"github.com/joho/godotenv" //"log" "fmt" + "log" + "database/sql" ) type Handler struct { @@ -33,18 +35,35 @@ func (h *Handler)FetchTableSchema () { if err != nil { panic(err) } - sess := conn.NewSession(nil) + session := conn.NewSession(nil) var tables []string - sess.SelectBySql("show tables").Load(&tables) + session.SelectBySql("show tables").Load(&tables) + + //var table_schema [][]string + mysql, error := sql.Open(db,dbuser+":"+password+"@tcp("+host+":"+port+")/"+dbname) + if error != nil { + log.Fatal("open erro: %v", err) + } - //var builder [][]string - //var table_columns [][]string for i := 0;i Date: Sat, 12 Aug 2017 23:47:32 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=E4=B8=80=E6=97=A6=E3=82=B3=E3=83=9F?= =?UTF-8?q?=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/sql/sql.go | 109 +++++++++++++++++++++++++++++++---------- 1 file changed, 82 insertions(+), 27 deletions(-) diff --git a/app/service/sql/sql.go b/app/service/sql/sql.go index b2c4ee5..bf33f83 100644 --- a/app/service/sql/sql.go +++ b/app/service/sql/sql.go @@ -1,7 +1,7 @@ package sql import ( - "github.com/gocraft/dbr" + //"github.com/gocraft/dbr" _ "github.com/go-sql-driver/mysql" //"github.com/joho/godotenv" //"log" @@ -31,36 +31,97 @@ func (h *Handler)FetchTableSchema () { dbname := "SASUKE_TEST" password := "password" - conn, err := dbr.Open(db,dbuser+":"+password+"@tcp("+host+":"+port+")/"+dbname,nil) - if err != nil { - panic(err) - } - session := conn.NewSession(nil) - var tables []string - session.SelectBySql("show tables").Load(&tables) + //conn, err := dbr.Open(db,dbuser+":"+password+"@tcp("+host+":"+port+")/use information_schema",nil) + //if err != nil { + // panic(err) + //} + //session := conn.NewSession(nil) + //var tables []string + //session.SelectBySql("show tables").Load(&tables) //var table_schema [][]string - mysql, error := sql.Open(db,dbuser+":"+password+"@tcp("+host+":"+port+")/"+dbname) + mysql, error := sql.Open(db,dbuser+":"+password+"@tcp("+host+":"+port+")/"+"information_schema") if error != nil { - log.Fatal("open erro: %v", err) + log.Fatal("open erro: %v", error) + } + + //use_query := "use information_schema;" + main_query := "select table_name,column_name from columns where table_schema=' "+dbname+ `';` + + //mysql.Query(use_query) + rows, err := mysql.Query(main_query) + + if err != nil { + panic(err.Error()) + } + + columns, err := rows.Columns() // カラム名を取得 + if err != nil { + panic(err.Error()) } - for i := 0;i Date: Sun, 13 Aug 2017 12:51:07 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=E4=B8=80=E6=97=A6=E3=82=B3=E3=83=9F?= =?UTF-8?q?=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/app.go | 28 +++++++++- app/service/sql/sql.go | 108 ++++++--------------------------------- app/views/app/Index.html | 6 +-- 3 files changed, 44 insertions(+), 98 deletions(-) diff --git a/app/controllers/app.go b/app/controllers/app.go index 97cd98d..b57caac 100644 --- a/app/controllers/app.go +++ b/app/controllers/app.go @@ -11,8 +11,32 @@ type App struct { func (c App) Index() revel.Result { s := &sql.Handler{} - s.FetchTableSchema() - return c.Render() + table_name_slice, column_name_slice := s.FetchTableSchema() + // tableのダブり値を削除 + m := make(map[string]bool) + uniq := [] string{} + + for _, ele := range table_name_slice { + if !m[ele] { + m[ele] = true + uniq = append(uniq, ele) + } + } + + // var table_schema [ len(uniq) ][len(column_name_slice)]string + + //for i:=0 ;i < len(column_name_slice) ;i++ { + // + // fmt.Printf(table_name_slice[i]) + // fmt.Printf(column_name_slice[i]) + // before_index := i -1 + // // テーブル名変更された時 + // if table_name_slice[i] != table_name_slice[before_index] { + // table_schema[i][0] = table_name_slice[i] + // table_schema[i] = append(table_schema[i], column_name_slice[i]) + // } + //} + return c.Render(table_name_slice, column_name_slice) } func (c App) Execute() revel.Result { diff --git a/app/service/sql/sql.go b/app/service/sql/sql.go index bf33f83..b29421c 100644 --- a/app/service/sql/sql.go +++ b/app/service/sql/sql.go @@ -1,11 +1,8 @@ package sql import ( - //"github.com/gocraft/dbr" _ "github.com/go-sql-driver/mysql" //"github.com/joho/godotenv" - //"log" - "fmt" "log" "database/sql" ) @@ -13,16 +10,8 @@ import ( type Handler struct { } -//var ( -// db string -// host string -// dbuser string -// dbname string -// password string -// port string -//) +func (h *Handler)FetchTableSchema ()([]string,[]string){ -func (h *Handler)FetchTableSchema () { //loadEnv(); db := "mysql" host :="localhost" @@ -31,106 +20,39 @@ func (h *Handler)FetchTableSchema () { dbname := "SASUKE_TEST" password := "password" - //conn, err := dbr.Open(db,dbuser+":"+password+"@tcp("+host+":"+port+")/use information_schema",nil) - //if err != nil { - // panic(err) - //} - //session := conn.NewSession(nil) - //var tables []string - //session.SelectBySql("show tables").Load(&tables) - - //var table_schema [][]string mysql, error := sql.Open(db,dbuser+":"+password+"@tcp("+host+":"+port+")/"+"information_schema") if error != nil { log.Fatal("open erro: %v", error) } - //use_query := "use information_schema;" - main_query := "select table_name,column_name from columns where table_schema=' "+dbname+ `';` - - //mysql.Query(use_query) + main_query :=`select table_name,column_name from columns where table_schema="`+dbname+ `";` rows, err := mysql.Query(main_query) if err != nil { panic(err.Error()) } + defer rows.Close() - columns, err := rows.Columns() // カラム名を取得 - if err != nil { - panic(err.Error()) + type TableSchema struct { + table_name string + column_name string } - values := make([]sql.RawBytes, len(columns)) - fmt.Print(len(values)) - // rows.Scan は引数に `[]interface{}`が必要. - - scanArgs := make([]interface{}, len(values)) - for i := range values { - scanArgs[i] = &values[i] - } + var table_name_slice []string + var column_name_slice []string for rows.Next() { - err = rows.Scan(scanArgs...) - if err != nil { - panic(err.Error()) + var table_name string + var column_name string + if err := rows.Scan(&table_name, &column_name); err != nil { + log.Fatal(err) } - var value string - for i, col := range values { - // Here we can check if the value is nil (NULL value) - if col == nil { - value = "NULL" - } else { - value = string(col) - } - fmt.Println(columns[i], ": ", value) - } - fmt.Println("-----------------------------------") + table_name_slice = append(table_name_slice,table_name) + column_name_slice = append(column_name_slice,column_name) } - //defer rows.Close() - // - //if err != nil { - // log.Fatal( err) - //} - // - //columns, err := rows.Columns() - //fmt.Print(columns) - // - //values := make([]sql.RawBytes, len(columns)) - //scanArgs := make([]interface{}, len(values)) - // - //for i := range values{ - // scanArgs[i] = &values[i] - //} - // - //for rows.Next() { - // err = rows.Scan(scanArgs...) - // if err != nil{ - // panic(err.Error()) - // } - // - // var value string - // for _, col := range values{ - // if col == nil{ - // value = "NULL" - // }else{ - // value = string(col) - // } - // fmt.Println(value) - // } - //} - //fmt.Println("---------------") - - - - //fmt.Println(table_columns[:]); - - - // 内容を整形する - - - return + return table_name_slice,column_name_slice } diff --git a/app/views/app/Index.html b/app/views/app/Index.html index 5ae661c..d665867 100644 --- a/app/views/app/Index.html +++ b/app/views/app/Index.html @@ -5,20 +5,20 @@
- こっちにテーブル表示 + こっちにテーブル表示
こっちにform
- {{template "footer.html" .}} \ No newline at end of file From d63762ebcaa35d71edfec35a26ab13bd90585ed8 Mon Sep 17 00:00:00 2001 From: kazuku higashiguchi Date: Sun, 13 Aug 2017 15:23:50 +0900 Subject: [PATCH 5/5] =?UTF-8?q?Query=E5=AE=9F=E8=A1=8C=E3=81=AE=E3=83=A1?= =?UTF-8?q?=E3=82=BD=E3=83=83=E3=83=89=E3=82=92sql=E3=83=91=E3=83=83?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B8=E3=81=AB=E8=BF=BD=E5=8A=A0=E3=80=81?= =?UTF-8?q?=E7=B5=90=E6=9E=9C=E8=A1=A8=E7=A4=BA=E7=94=BB=E9=9D=A2=E3=81=AE?= =?UTF-8?q?=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/app.go | 22 +++++++-- app/service/sql/sql.go | 100 +++++++++++++++++++++++++++++++------- app/views/app/Result.html | 22 +++++++++ tests/configtest.go | 10 ++-- 4 files changed, 128 insertions(+), 26 deletions(-) diff --git a/app/controllers/app.go b/app/controllers/app.go index 9590d93..6dfc42b 100644 --- a/app/controllers/app.go +++ b/app/controllers/app.go @@ -90,14 +90,26 @@ func (c App) Execute() revel.Result { // 外部キーを取得 sc := []rune(table) foreign_key := string(sc[:(len(sc) - 1)]) + "_id" - query = "select " + select_columns + " from " + table + " left join " + relation + " on " + table + ".id " + "= " + relation + "." + foreign_key + query = "select " + select_columns + + " from " + table + + " left join " + relation + + " on " + table + ".id " + "= " + relation + "." + foreign_key } - // todo sqlを投げて、その結果を渡す - return c.Render(query, columns) - // return c.Redirect(App.Result, query) + + // Query実行 + s := &sql.Handler{} + hcolumns, records := s.ExecuteQuery(query) + + return c.Redirect(App.Result, hcolumns, records) } func (c App) Result() revel.Result { - return c.Render() + // (画面確認用)結果画面の確認のため:Query実行 + query := "select * from articles;" + s := &sql.Handler{} + hcolumns, records := s.ExecuteQuery(query) + return c.Render(hcolumns, records) + + return c.Render(hcolumns, records) } diff --git a/app/service/sql/sql.go b/app/service/sql/sql.go index b29421c..836aeb8 100644 --- a/app/service/sql/sql.go +++ b/app/service/sql/sql.go @@ -2,36 +2,43 @@ package sql import ( _ "github.com/go-sql-driver/mysql" - //"github.com/joho/godotenv" "log" "database/sql" + "sasuke/app/service/file" + "os" ) type Handler struct { } + func (h *Handler)FetchTableSchema ()([]string,[]string){ - //loadEnv(); - db := "mysql" - host :="localhost" - port := "3306" - dbuser := "root" - dbname := "SASUKE_TEST" - password := "password" + // Todo: Connect() + f := &file.Handler{} + f.LoadEnv(); + + db := os.Getenv("db") + host := os.Getenv("host") + port := os.Getenv("port") + dbuser := os.Getenv("dbuser") + dbname := os.Getenv("dbname") + password := os.Getenv("password") mysql, error := sql.Open(db,dbuser+":"+password+"@tcp("+host+":"+port+")/"+"information_schema") if error != nil { log.Fatal("open erro: %v", error) } + defer mysql.Close() - main_query :=`select table_name,column_name from columns where table_schema="`+dbname+ `";` - rows, err := mysql.Query(main_query) + + main_query :=`select table_name,column_name from columns where table_schema="`+dbname+ `";` + rows, err := mysql.Query(main_query) + defer rows.Close() if err != nil { panic(err.Error()) } - defer rows.Close() type TableSchema struct { table_name string @@ -57,9 +64,68 @@ func (h *Handler)FetchTableSchema ()([]string,[]string){ -//func loadEnv() { -// err := godotenv.Load() -// if err != nil { -// log.Fatal("Error loading .env file") -// } -//} +// SQL Queryを実行し、カラム名・結果レコードを返す +func(h *Handler) ExecuteQuery(query string)([]string, [][]interface{}){ + + // Todo: Connect() + f := &file.Handler{} + f.LoadEnv(); + + db := os.Getenv("db") + host := os.Getenv("host") + port := os.Getenv("port") + dbuser := os.Getenv("dbuser") + dbname := os.Getenv("dbname") + password := os.Getenv("password") + + mysql, err := sql.Open(db,dbuser+":"+password+"@tcp("+host+":"+port+")/"+dbname) + if err != nil { + log.Fatal("open erro: %v", err) + } + defer mysql.Close() + + + // query実行 + rows, err := mysql.Query(query) + if err != nil{ + panic(err.Error()) + } + defer rows.Close() + + // オブジェクトから値を取り出す + // rows.Scanで値を取り出すために[]interface{}を定義 + columns, err := rows.Columns() + if err != nil { + panic(err.Error()) + } + count := len(columns) + valuePtrs := make([]interface{}, count) + + records := make([][]interface{}, 0) + + + for rows.Next() { + values := make([]interface{}, count) + + for i,_ := range columns{ + valuePtrs[i] = &values[i] + } + rows.Scan(valuePtrs...) + + for i,_ := range columns{ + var v interface{} + val := values[i] + b, ok := val.([]byte) + if(ok){ + v = string(b) + }else{ + v = val + } + values[i] = v + } + records = append(records, values) + } + + return columns, records; +} + diff --git a/app/views/app/Result.html b/app/views/app/Result.html index 8a932a5..5a51832 100644 --- a/app/views/app/Result.html +++ b/app/views/app/Result.html @@ -8,6 +8,28 @@
{{template "flash.html" .}}
+
+ + + + + {{ range $index, $column := .hcolumns }} + + {{ end }} + + + + {{ range $index, $records := .records }} + + + {{ range $index, $value := $records }} + + {{ end }} + + {{ end }} + +
#{{ $column }}
{{ $index }}{{ $value }}
+
diff --git a/tests/configtest.go b/tests/configtest.go index a4f2927..7a76670 100644 --- a/tests/configtest.go +++ b/tests/configtest.go @@ -32,12 +32,13 @@ func (t *ConfigTest) TestConfigPageWorks(){ func (t *ConfigTest) TestConfigPostFormSuccessData(){ + // 自分の開発環境の接続情報 testdb = "mysql" - testhost = "192.168.192.168" + testhost = "0.0.0.0" testport = "3306" - testuser = "testuser" - testname = "testdb" - testpass = "P@ssw0rd" + testuser = "root" + testname = "SASUKE_TEST" + testpass = "mysql" configData := url.Values{} configData.Add("db", testdb) @@ -54,6 +55,7 @@ func (t *ConfigTest) TestConfigPostFormSuccessData(){ f := &file.Handler{} f.LoadEnv() + t.AssertEqual(testdb, os.Getenv("db")) t.AssertEqual(testhost, os.Getenv("host")) t.AssertEqual(testport, os.Getenv("port"))