mirror of https://github.com/mattn/go-sqlite3.git
first prototype of an actual commandline tool
This commit is contained in:
parent
9101028e5c
commit
beacf72c77
|
@ -0,0 +1,71 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
"log"
|
||||
"os"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
log.Fatal("not enough arguments")
|
||||
}
|
||||
path := os.Args[1]
|
||||
query := os.Args[2]
|
||||
db, err := sql.Open("sqlite3", path)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer db.Close()
|
||||
runQuery(db, query)
|
||||
}
|
||||
|
||||
func runQuery(db *sql.DB, query string) (err error) {
|
||||
rows, err := db.Query(query)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
cols, err := rows.ColumnTypes()
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
// http://go-database-sql.org/varcols.html
|
||||
vals := make([]interface{}, len(cols))
|
||||
for i, types := range cols {
|
||||
vals[i] = new(sql.RawBytes)
|
||||
fmt.Printf("%-50s\t", types.Name())
|
||||
/* debugging...
|
||||
length, ok := types.Length()
|
||||
if !ok {
|
||||
length = 0
|
||||
}
|
||||
fmt.Printf("%s[%s]\t", types.DatabaseTypeName(), length)
|
||||
*/
|
||||
}
|
||||
fmt.Printf("\n")
|
||||
for rows.Next() {
|
||||
if err := rows.Scan(vals...); err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
// Now you can check each element of vals for nil-ness,
|
||||
// and you can use type introspection and type assertions
|
||||
// to fetch the column into a typed variable.
|
||||
for i, _ := range vals {
|
||||
if vals[i] == nil {
|
||||
fmt.Printf("%-50s\t", "NULL")
|
||||
} else {
|
||||
fmt.Printf("%-50s\t", vals[i])
|
||||
}
|
||||
}
|
||||
fmt.Printf("\n")
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
return err
|
||||
}
|
Loading…
Reference in New Issue