import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
package main
import "database/sql"
func main() {
dsn := "username:password@tcp(localhost:3306)/database_namecharset=utf8mb4"
// 不会校验账号密码是否正确
// 注意!!!这里不要使用:=,我们是给全局变量赋值,然后在main函数中使用全局变量db
db, err := sql.Open("mysql", dsn)
if err != nil {
return
}
// 尝试与数据库建立连接(校验dsn是否正确)
err = db.Ping()
if err != nil {
return
}
defer db.Close()
}
注意:username
、password
和 database_name
替换为你的实际数据库用户名、密码和要创建的数据库名称。`
package main
import (
"database/sql"
"fmt"
"log"
)
func main() {
......
defer db.Close()
// 测试连接
err = db.Ping()
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to the database")
}
CREATE DATABASE IF NOT EXISTS database_name
注意: 可以在 navicat 上直接新建查询创建。
// 创建表
func createTable(db *sql.DB) error {
// 创建用户表
query := `CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT
)`
// 执行sql
_, err := db.Exec(query)
if err != nil {
return err
}
fmt.Println("Table created successfully")
return nil
}
// 插入数据
func insertData(db *sql.DB, name string, age int) error {
query := "INSERT INTO users (name, age) VALUES (?, ?)"
_, err := db.Exec(query, name, age)
if err != nil {
return err
}
fmt.Println("Data inserted successfully")
return nil
}
// 查询数据
func queryData(db *sql.DB) (*sql.Rows, error) {
query := "SELECT name, age FROM users"
rows, err := db.Query(query)
if err != nil {
return nil, err
}
return rows, nil
}
// 更新数据
func updateData(db *sql.DB, name string, age int) error {
query := "UPDATE users SET age = ? WHERE name = ?"
_, err := db.Exec(query, age, name)
if err != nil {
return err
}
fmt.Println("Data updated successfully")
return nil
}
// 删除数据
func deleteData(db *sql.DB, name string) error {
query := "DELETE FROM users WHERE name = ?"
_, err := db.Exec(query, name)
if err != nil {
return err
}
fmt.Println("Data deleted successfully")
return nil
}
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// username、password和database_name替换为你的实际数据库用户名、密码和要创建的数据库名称
dsn := "username:password@tcp(localhost:3306)/database_name?charset=utf8mb4"
// 连接数据库
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 测试连接
err = db.Ping()
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to the database")
// 创建表
err = createTable(db)
if err != nil {
log.Fatal(err)
}
// 插入数据
err = insertData(db, "倾心1", 22)
if err != nil {
log.Fatal(err)
}
err = insertData(db, "倾心2", 22)
if err != nil {
log.Fatal(err)
}
// 查询数据
rows, err := queryData(db)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
// 遍历结果
for rows.Next() {
var name string
var age int
err := rows.Scan(&name, &age)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Name: %s, Age: %d\n", name, age)
}
// 更新数据
err = updateData(db, "倾心1", 30)
if err != nil {
log.Fatal(err)
}
// 删除数据
err = deleteData(db, "倾心1")
if err != nil {
log.Fatal(err)
}
}
// 创建表
func createTable(db *sql.DB) error {
query := `CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT
)`
_, err := db.Exec(query)
if err != nil {
return err
}
fmt.Println("Table created successfully")
return nil
}
// 插入数据
func insertData(db *sql.DB, name string, age int) error {
query := "INSERT INTO users (name, age) VALUES (?, ?)"
_, err := db.Exec(query, name, age)
if err != nil {
return err
}
fmt.Println("Data inserted successfully")
return nil
}
// 查询数据
func queryData(db *sql.DB) (*sql.Rows, error) {
query := "SELECT name, age FROM users"
rows, err := db.Query(query)
if err != nil {
return nil, err
}
return rows, nil
}
// 更新数据
func updateData(db *sql.DB, name string, age int) error {
query := "UPDATE users SET age = ? WHERE name = ?"
_, err := db.Exec(query, age, name)
if err != nil {
return err
}
fmt.Println("Data updated successfully")
return nil
}
// 删除数据
func deleteData(db *sql.DB, name string) error {
query := "DELETE FROM users WHERE name = ?"
_, err := db.Exec(query, name)
if err != nil {
return err
}
fmt.Println("Data deleted successfully")
return nil
}
执行go run main.go
事务(Transaction)是数据库管理系统执行的一个操作序列,被视为一个逻辑单元,要么全部成功执行,要么全部失败回滚。
MySQL 提供了多种操作事务的方法,包括开始事务(BEGIN
、START TRANSACTION
)、提交事务(COMMIT
)和回滚事务(ROLLBACK
)等。
事务开始
func (db *DB) Begin() (*Tx, error)
提交事务
func (tx *Tx) Commit() error
回滚事务
func (tx *Tx) Rollback() error
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 创建数据库连接
dsn := "root:123456@tcp(localhost:3306)/database_name?charset=utf8mb4"
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 开始事务
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
// 插入一条记录
_, err = tx.Exec("INSERT INTO users (name, email) VALUES (?, ?)", "倾心3", "[email protected]")
if err != nil {
// 回滚事务
tx.Rollback()
log.Fatal(err)
}
// 更新记录的邮箱
_, err = tx.Exec("UPDATE users SET email = ? WHERE name = ?", "[email protected]", "倾心3")
if err != nil {
// 回滚事务
tx.Rollback()
log.Fatal(err)
}
// 提交事务
err = tx.Commit()
if err != nil {
log.Fatal(err)
}
fmt.Println("Transaction committed successfully")
}
在上述示例中,我们首先插入了一条记录到 users
表,然后更新了该记录的邮箱。如果任何一个操作失败,事务会被回滚,不会对数据库产生影响。只有在所有操作都成功完成后,我们才会提交事务。
注意,在实际开发中,你需要根据需要处理错误、设置适当的事务隔离级别,并根据实际情况对事务进行回滚或提交。这个示例只是一个简单的演示,以帮助你理解事务的基本概念和操作。