最近忙しくてなかなかGo言語の勉強ができていない
Go
sqlite
sqliteを操作するためのライブラリももちろんある。
package main import ( "database/sql" "fmt" "log" _ "github.com/mattn/go-sqlite3" ) var DbConnection *sql.DB type Person struct { Name string Age int } func main() { DbConnection, _ := sql.Open("sqlite3", "./example.sql") defer DbConnection.Close() cmd := `CREATE TABLE IF NOT EXISTS person( name STRING, age INT)` _, err := DbConnection.Exec(cmd) if err != nil { log.Fatalln(err) } //cmd = "INSERT INTO person (name, age) VALUES (?, ?)" //_, err = DbConnection.Exec(cmd, "Namcy", 20) //if err != nil { // log.Fatalln(err) //} //cmd = "UPDATE person SET age = ? WHERE name = ?" //_, err = DbConnection.Exec(cmd, 25, "Mike") //if err != nil { // log.Fatalln(err) //} //cmd = "SELECT * FROM person" //rows, _ := DbConnection.Query(cmd) //defer rows.Close() //var pp []Person //for rows.Next() { // var p Person // err := rows.Scan(&p.Name, &p.Age) // if err != nil { // log.Println(err) // } // pp = append(pp, p) //} //err = rows.Err() //if err != nil { // log.Fatalln(err) //} //for _, p := range pp { // fmt.Println(p.Name, p.Age) //} //cmd = "SELECT * FROM person where age = ?" //row := DbConnection.QueryRow(cmd, 1000) //var p Person //err = row.Scan(&p.Name, &p.Age) //if err != nil { // if err == sql.ErrNoRows { // log.Println("No row") // } else { // log.Println(err) // } //} //fmt.Println(p.Name, p.Age) //cmd = "DELETE FROM person WHERE name = ?" //_, err = DbConnection.Exec(cmd, "Namcy") //if err != nil { // log.Fatalln(err) //} tableName := "person" cmd = fmt.Sprintf("SELECT * FROM %s", tableName) rows, _ := DbConnection.Query(cmd) defer rows.Close() var pp []Person for rows.Next() { var p Person err := rows.Scan(&p.Name, &p.Age) if err != nil { log.Println(err) } pp = append(pp, p) } err = rows.Err() if err != nil { log.Fatalln(err) } for _, p := range pp { fmt.Println(p.Name, p.Age) } }
create tableする際はcmdにcrete tableをつめる
DbConnection, _ := sql.Open("sqlite3", "./example.sql") defer DbConnection.Close() cmd := `CREATE TABLE IF NOT EXISTS person( name STRING, age INT)`
insert
cmd = "INSERT INTO person (name, age) VALUES (?, ?)" _, err = DbConnection.Exec(cmd, "Namcy", 20) if err != nil { log.Fatalln(err) }
update
cmd = "UPDATE person SET age = ? WHERE name = ?" _, err = DbConnection.Exec(cmd, 25, "Mike") if err != nil { log.Fatalln(err) }
select(こっちは配列の中に結果を詰めて全件探索するパターン)
cmd = "SELECT * FROM person" rows, _ := DbConnection.Query(cmd) defer rows.Close() var pp []Person for rows.Next() { var p Person err := rows.Scan(&p.Name, &p.Age) if err != nil { log.Println(err) } pp = append(pp, p) } err = rows.Err() if err != nil { log.Fatalln(err) } for _, p := range pp { fmt.Println(p.Name, p.Age) }
select(単一のパターン)
cmd = "SELECT * FROM person where age = ?" row := DbConnection.QueryRow(cmd, 1000) var p Person err = row.Scan(&p.Name, &p.Age) if err != nil { if err == sql.ErrNoRows { log.Println("No row") } else { log.Println(err) } } fmt.Println(p.Name, p.Age) cmd = "DELETE FROM person WHERE name = ?" _, err = DbConnection.Exec(cmd, "Namcy") if err != nil { log.Fatalln(err) }
tablenameを指定してSQL文を実行することfができる
tableName := "person" cmd = fmt.Sprintf("SELECT * FROM %s", tableName) rows, _ := DbConnection.Query(cmd) defer rows.Close() var pp []Person for rows.Next() { var p Person err := rows.Scan(&p.Name, &p.Age) if err != nil { log.Println(err) } pp = append(pp, p) } err = rows.Err() if err != nil { log.Fatalln(err) } for _, p := range pp { fmt.Println(p.Name, p.Age) }
ioutil
「This is a sample Page.」と記載のあるtest.txtを作成する。
loadPage関数でtitleの.txt(今回はtext.txt)を読み込んでそのファイルのファイル名と中身をreturnする。
package main import ( "fmt" "io/ioutil" ) type Page struct { Title string Body []byte } func (p *Page) save() error { filename := p.Title + ".txt" return ioutil.WriteFile(filename, p.Body, 0600) } func loadPage(title string) (*Page, error) { filename := title + ".txt" body, err := ioutil.ReadFile(filename) if err != nil { return nil, err } return &Page{Title: title, Body: body}, nil } func main() { p1 := &Page{Title: "test", Body: []byte("This is a sample Page.")} p1.save() p2, _ := loadPage(p1.Title) fmt.Println(string(p2.Body)) }
読書
46冊目
https://note.com/shosagyo/n/n0f549dcb3cc1