当前位置:网站首页>database/sql

database/sql

2022-06-24 21:07:00 AcTarjan

official database/sql Package introduction

Introduce

  • stay Go Access the database in , Need to use sql.DB Type is used to create statements and transactions , Execute queries and get results
  • One sql.DB Not a database connection , It is an abstraction of a database
  • sql.DB Open or close the connection with the actual database through the driver and manage a connection pool as required
  • database/sql The package just provides an interface , There is no implementation , Therefore, you also need to import the third-party database driver
  • Third party drives should not normally be used directly , Instead, just quote database/sql Methods and types defined in , This helps avoid making your code dependent on the driver

Connect to database

import (
    "database/sql"								// Just import the driver you need 
    _ "github.com/go-sql-driver/mysql"			//mysql drive 
    _ "github.com/lib/pq"						//postgres drive 
)

func main() {
    
	// Avoid repetition open, take db As a global variable or parameter 
    db, err := sql.Open("mysql", "user:[email protected](127.0.0.1:3306)/dbdemo")
    db, err := sql.Open("postgres", "postgres://bob:[email protected]:5432/mydb?sslmode=verify-full")
    db, err = sql.Open("postgres", "user=bob password=secret host=1.2.3.4 port=5432 dbname=mydb sslmode=verify-full")
    if err != nil {
    
        log.Fatal(err)
    }
    // Only close at the end db
    defer db.Close()
    
    // Test connectivity to the database 
    err = db.Ping()
	if err != nil {
    
    // do something here
	}
}

Operating the database

  • stay MySQL in , The parameter placeholder is ?; stay PostgreSQL In Chinese, it means $N, among N For from 1 The starting number ;SQLite Accept one of the two ;Oracle Begin with a colon in the placeholder , And named it :param1

Inquire about

General query

var (
    id   int
    name string
)
rows, err := db.Query("SELECT id,name FROM users WHERE id = $1", 1)
if err != nil {
    
    log.Fatal(err)
}
//rows Not closed , The underlying connection is busy , Not available in connection pool , Will cause memory leaks 
defer rows.Close()
for rows.Next() {
    
	// Exceptions in processing 
    err := rows.Scan(&id, &name)
    if err != nil {
    
        log.Fatal(err)
    }
    log.Println(id, name)
}
// Handle exceptions at the end 
err = rows.Err()
if err != nil {
    
    log.Fatal(err)
}

Single line query

var name string
// No need to close row
err = db.QueryRow("SELECT name FROM users WHERE id = $1", 1).Scan(&name)
if err != nil {
    
    log.Fatal(err)
}
fmt.Println(name)

Precompile query

  • The so-called precompiled sentence is to translate this kind of SQL The value in the statement is replaced by a placeholder , It can be regarded as taking SQL Statement templating
  • A compilation 、 Multiple runs , The process of analysis and optimization is omitted ; In addition, precompiled statements can prevent SQL Inject
stmt,err := db.Prepare("SELECT id,name FROM users WHERE id = $1")
if err != nil {
    
    log.Fatal(err)
}
defer stmt.Close()
rows, err := stmt.Query(1)
if err != nil {
    
    log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
    
    // ...
}
if err = rows.Err(); err != nil {
    
    log.Fatal(err)
}

// Precompiled single row query 
stmt, err := db.Prepare("SELECT name FROM users WHERE id = $1")
if err != nil {
    
    log.Fatal(err)
}
var name string
err = stmt.QueryRow(1).Scan(&name)
if err != nil {
    
    log.Fatal(err)
}
fmt.Println(name)

modify

  • Use Exec() To complete , It is best to use a precompiled statement to complete INSERT,UPDATE,DELETE Or other statements that do not return rows
stmt, err := db.Prepare("INSERT INTO users(name) VALUES($1)")
if err != nil {
    
    log.Fatal(err)
}
res, err := stmt.Exec("Dolly")
if err != nil {
    
    log.Fatal(err)
}
lastId, err := res.LastInsertId()
if err != nil {
    
    log.Fatal(err)
}
rowCnt, err := res.RowsAffected()
if err != nil {
    
    log.Fatal(err)
}
log.Printf("ID = %d, affected = %d ", lastId, rowCnt)
原网站

版权声明
本文为[AcTarjan]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202211319437918.html