たなしょのメモ

日々勉強していることをつらつらと

週報8/24

最近忙しくてなかなか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

47冊目
https://note.com/shosagyo/n/nc86401610e56

48冊目
https://note.com/shosagyo/n/n686470d03e01