package main
import ( "database/sql" "fmt" "time"
_ "github.com/lib/pq" )
const ( host = "127.0.0.1" port = 5866 dbname = "test" user = "test" password = "test" )
/* 需要注意的是sql.DB并不是数据库连接,而是一个go中的一个数据结构 在拿到sql.DB时并不会创建新的连接,而可以认为是拿到了一个数据库连接池。 通常来说一个sql.DB应该像全局变量一样长期保存,只有在执行数据库操作(如Ping()操作)时才会自动生成一个连接并连接数据库。 在连接操作执行完毕后应该及时地释放,此处说的释放是指释放连接而不是sql.DB连接,而不要在某一个小函数中都进行Open()和Close()操作,否则会引起资源耗尽的问题。 */
func connectDB() *sql.DB { psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname) db, err := sql.Open("postgres", psqlInfo) if err != nil { panic(err) } err = db.Ping() if err != nil { panic(err) } fmt.Println("Successfully connected!") return db }
func query_version(db *sql.DB) { var name string rows, err := db.Query("select '数据库版本:['||version()||']' as name") if err != nil { fmt.Println(err) } defer rows.Close() for rows.Next() { err := rows.Scan(&name) if err != nil { fmt.Println(err) } } err = rows.Err() if err != nil { fmt.Println(err) } fmt.Println(name) }
type student struct { id int name string age int birthday time.Time }
func query_data(db *sql.DB) { //rows, err := db.Query("select * from student where user_name=$1", "ah") rows, err := db.Query("select * from student") if err != nil { panic(err) } //延迟关闭rows defer rows.Close()
for rows.Next() { stu := student{} err := rows.Scan(&stu.id, &stu.name, &stu.age, &stu.birthday) if err != nil { panic(err) } fmt.Printf("id = %v, name = %v, age = %v, birthday = %v\n", stu.id, stu.name, stu.age, stu.birthday.Format("2006-01-02 15:04:05")) }
}
func insert_data(db *sql.DB) { //PostgreSQL是通过$1,$2这种方式来指定要传递的参数 stmt, err := db.Prepare("INSERT INTO student(name, age, birthday) VALUES($1, $2, $3)") if err != nil { panic(err) }
res, err := stmt.Exec("Go语言", 35, time.Now()) /* 使用Exec()函数后会返回一个sql.Result即上面的res变量接收到的返回值, 它提供了LastInserId() (int64, error)和RowsAffected() (int64, error) 分别获取执行语句返回的对应的id和语句执行所影响的行数
注意:pg不支持LastInsertId函数,因为没有实现类似MySQL的自增ID返回 */ if err != nil { panic(err) }
fmt.Printf("res = %d", res) }
func update_data(db *sql.DB) { stmt, err := db.Prepare("update stduent set name=$1 WHERE name=$2") if err != nil { panic(err) } res, err := stmt.Exec("我改了新名字", "Go语言") if err != nil { panic(err) }
fmt.Printf("res = %d", res) }
func delete_data(db *sql.DB) { stmt, err := db.Prepare("delete from student where name=$1") if err != nil { panic(err) } res, err := stmt.Exec("Go语言") if err != nil { panic(err) }
fmt.Printf("res = %d", res) }
func main() { db := connectDB() insert_data(db) //query_data(db) //update_data(db) //delete_data(db) }
|