From 9200ffb5b76ec1355c5f453af44652960b3b66c2 Mon Sep 17 00:00:00 2001 From: Luis Bosquez Gonzalez Date: Thu, 18 May 2017 17:44:35 -0700 Subject: [PATCH] Adding go tutorials --- samples/tutorials/go/README.md | 5 ++ samples/tutorials/go/columnstore.go | 46 ++++++++++++++ samples/tutorials/go/connect.go | 33 ++++++++++ samples/tutorials/go/crud.go | 99 +++++++++++++++++++++++++++++ samples/tutorials/go/orm.go | 98 ++++++++++++++++++++++++++++ 5 files changed, 281 insertions(+) create mode 100644 samples/tutorials/go/README.md create mode 100644 samples/tutorials/go/columnstore.go create mode 100644 samples/tutorials/go/connect.go create mode 100644 samples/tutorials/go/crud.go create mode 100644 samples/tutorials/go/orm.go diff --git a/samples/tutorials/go/README.md b/samples/tutorials/go/README.md new file mode 100644 index 0000000000..13b186f538 --- /dev/null +++ b/samples/tutorials/go/README.md @@ -0,0 +1,5 @@ +# Set up instructions + +1. `go get github.com/denisenkom/go-mssqldb` +1. `go install github.com/denisenkom/go-mssqldb` +1. `go run .go` diff --git a/samples/tutorials/go/columnstore.go b/samples/tutorials/go/columnstore.go new file mode 100644 index 0000000000..a9994798e9 --- /dev/null +++ b/samples/tutorials/go/columnstore.go @@ -0,0 +1,46 @@ +package main + +import _ "github.com/denisenkom/go-mssqldb" +import "database/sql" +import "log" +import "fmt" +import "time" + +var server = "localhost" +var port = 1433 +var user = "sa" +var password = "your_password" +var database = "SampleDB" + +// Delete an employee from database +func ExecuteAggregateStatement(db *sql.DB) { + result, err := db.Prepare("SELECT SUM(Price) as sum FROM Table_with_5M_rows") + if err != nil { + fmt.Println("Error preparing query: " + err.Error()) + } + + row := result.QueryRow() + var sum string + err = row.Scan(&sum) + fmt.Printf("Sum: %s\n", sum) +} + +func main() { + // Connect to database + connString := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s;", + server, user, password, port, database) + conn, err := sql.Open("mssql", connString) + if err != nil { + log.Fatal("Open connection failed:", err.Error()) + } + fmt.Printf("Connected!\n") + defer conn.Close() + + t1 := time.Now() + fmt.Printf("Start time: %s\n", t1) + + ExecuteAggregateStatement(conn) + + t2 := time.Since(t1) + fmt.Printf("The query took: %s\n", t2) +} \ No newline at end of file diff --git a/samples/tutorials/go/connect.go b/samples/tutorials/go/connect.go new file mode 100644 index 0000000000..da320b1a1a --- /dev/null +++ b/samples/tutorials/go/connect.go @@ -0,0 +1,33 @@ +package main + +import _ "github.com/denisenkom/go-mssqldb" +import "database/sql" +import "log" +import "fmt" + + +var server = "localhost" +var port = 1433 +var user = "sa" +var password = "your_password" + +func main() { + connString := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d", + server, user, password, port) + + conn, err := sql.Open("mssql", connString) + if err != nil { + log.Fatal("Open connection failed:", err.Error()) + } + fmt.Printf("Connected!\n") + defer conn.Close() + stmt, err := conn.Prepare("select @@version") + row := stmt.QueryRow() + var result string + + err = row.Scan(&result) + if err != nil { + log.Fatal("Scan failed:", err.Error()) + } + fmt.Printf("%s\n", result) +} \ No newline at end of file diff --git a/samples/tutorials/go/crud.go b/samples/tutorials/go/crud.go new file mode 100644 index 0000000000..efb18c9c9f --- /dev/null +++ b/samples/tutorials/go/crud.go @@ -0,0 +1,99 @@ +package main + +import _ "github.com/denisenkom/go-mssqldb" +import "database/sql" +import "log" +import "fmt" + +var server = "localhost" +var port = 1433 +var user = "sa" +var password = "your_password" +var database = "SampleDB" + +// Create an employee +func CreateEmployee(db *sql.DB, name string, location string) (int64, error) { + tsql := fmt.Sprintf("INSERT INTO TestSchema.Employees (Name, Location) VALUES ('%s','%s');", + name, location) + result, err := db.Exec(tsql) + if err != nil { + fmt.Println("Error inserting new row: " + err.Error()) + return -1, err + } + return result.LastInsertId() +} + +// Read all employees +func ReadEmployees(db *sql.DB) (int, error) { + tsql := fmt.Sprintf("SELECT Id, Name, Location FROM TestSchema.Employees;") + rows, err := db.Query(tsql) + if err != nil { + fmt.Println("Error reading rows: " + err.Error()) + return -1, err + } + defer rows.Close() + var count int = 0 + for rows.Next(){ + var name, location string + var id int + err := rows.Scan(&id, &name, &location) + if err != nil { + fmt.Println("Error reading rows: " + err.Error()) + return -1, err + } + fmt.Printf("ID: %d, Name: %s, Location: %s\n", id, name, location) + count++ + } + return count, nil +} + +// Update an employee's information +func UpdateEmployee(db *sql.DB, name string, location string) (int64, error) { + tsql := fmt.Sprintf("UPDATE TestSchema.Employees SET Location = '%s' WHERE Name= '%s'", + location, name) + result, err := db.Exec(tsql) + if err != nil { + fmt.Println("Error updating row: " + err.Error()) + return -1, err + } + return result.LastInsertId() +} + +// Delete an employee from database +func DeleteEmployee(db *sql.DB, name string) (int64, error) { + tsql := fmt.Sprintf("DELETE FROM TestSchema.Employees WHERE Name='%s';", name) + result, err := db.Exec(tsql) + if err != nil { + fmt.Println("Error deleting row: " + err.Error()) + return -1, err + } + return result.RowsAffected() +} + +func main() { + // Connect to database + connString := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s;", + server, user, password, port, database) + conn, err := sql.Open("mssql", connString) + if err != nil { + log.Fatal("Open connection failed:", err.Error()) + } + fmt.Printf("Connected!\n") + defer conn.Close() + + // Create employee + createId, err := CreateEmployee(conn, "Jake", "United States") + fmt.Printf("Inserted ID: %d successfully.\n", createId) + + // Read employees + count, err := ReadEmployees(conn) + fmt.Printf("Read %d rows successfully.\n", count) + + // Update from database + updateId, err := UpdateEmployee(conn, "Jake", "Poland") + fmt.Printf("Updated row with ID: %d successfully.\n", updateId) + + // Delete from database + rows, err := DeleteEmployee(conn, "Jake") + fmt.Printf("Deleted %d rows successfully.\n", rows) +} \ No newline at end of file diff --git a/samples/tutorials/go/orm.go b/samples/tutorials/go/orm.go new file mode 100644 index 0000000000..c68b8ae468 --- /dev/null +++ b/samples/tutorials/go/orm.go @@ -0,0 +1,98 @@ +package main + +import ( + "fmt" + "github.com/jinzhu/gorm" + _ "github.com/jinzhu/gorm/dialects/mssql" +) + +var server = "localhost" +var port = 1433 +var user = "sa" +var password = "your_password" +var database = "SampleDB" + +type User struct { + gorm.Model + FirstName string + LastName string +} + +type Task struct { + gorm.Model + Title string + DueDate string + IsComplete bool + UserID uint +} + +func ReadAllTasks(db *gorm.DB){ + var users []User + var tasks []Task + db.Find(&users) + + for _, user := range users{ + db.Model(&user).Related(&tasks) + fmt.Printf("%s %s's tasks:\n", user.FirstName, user.LastName) + for _, task := range tasks { + fmt.Printf("Title: %s\nDueDate: %s\nIsComplete:%t\n\n", + task.Title, task.DueDate, task.IsComplete) + } + } +} + +func UpdateSomeonesTask(db *gorm.DB, userId int){ + var task Task + db.Where("user_id = ?", userId).First(&task).Update("Title", "Buy donuts for Luis") + fmt.Printf("Title: %s\nDueDate: %s\nIsComplete:%t\n\n", + task.Title, task.DueDate, task.IsComplete) +} + +func DeleteSomeonesTasks(db *gorm.DB, userId int){ + db.Where("user_id = ?", userId).Delete(&Task{}) + fmt.Printf("Deleted all tasks for user %d", userId) +} + +func main() { + connectionString := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s", + server, user, password, port, database) + db, err := gorm.Open("mssql", connectionString) + + if err != nil { + panic("failed to connect database") + } + gorm.DefaultCallback.Create().Remove("mssql:set_identity_insert") + defer db.Close() + + fmt.Println("Migrating models...") + db.AutoMigrate(&User{}) + db.AutoMigrate(&Task{}) + + // Create awesome Users + fmt.Println("Creating awesome users...") + db.Create(&User{FirstName: "Andrea", LastName: "Lam"}) //UserID: 1 + db.Create(&User{FirstName: "Meet", LastName: "Bhagdev"}) //UserID: 2 + db.Create(&User{FirstName: "Luis", LastName: "Bosquez"}) //UserID: 3 + + // Create appropriate Tasks for each user + fmt.Println("Creating new appropriate tasks...") + db.Create(&Task{ + Title: "Do laundry", DueDate: "2017-03-30", IsComplete: false, UserID: 1}) + db.Create(&Task{ + Title: "Mow the lawn", DueDate: "2017-03-30", IsComplete: false, UserID: 2}) + db.Create(&Task{ + Title: "Do more laundry", DueDate: "2017-03-30", IsComplete: false, UserID: 3}) + db.Create(&Task{ + Title: "Watch TV", DueDate: "2017-03-30", IsComplete: false, UserID: 3}) + + // Read + fmt.Println("Reading all the tasks...") + ReadAllTasks(db) + + // Update - update Task title to something more appropriate + fmt.Println("Updating Andrea's task...") + UpdateSomeonesTask(db, 1) + + // Delete - delete Luis's task + DeleteSomeonesTasks(db, 3) +} \ No newline at end of file