010-Go 操作PostgreSQL数据库2

本文介绍了一个使用Go语言实现的简易博客系统,包括创建数据库表结构、定义模型、执行增删改查操作等核心功能。通过具体的代码示例展示了如何与PostgreSQL数据库进行交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:sql脚本

create table post(
    id    serial primary key,
    content    text,
    author    varchar(100)
)

 

2:post.go

package post

import(
	"fmt"
	"database/sql"
	_"github.com/lib/pq"
)

const(
    host = "192.168.72.128"
    port = 5432
    user = "test"
    password = "test"
    dbname = "testdb"
)

type Post struct{
	ID		int
	Content string
	Author	string
}

var Db *sql.DB

func init(){
	var err error
	
	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)
	}
}

func (post *Post) GetPosts(limit int) (posts []Post, err error){
	sql := "select id,content,author from post limit $1";
	
	rows, err := Db.Query(sql, limit)
	if err != nil{
		return
	}

	defer rows.Close()

	for rows.Next(){
		post := Post{}
		err = rows.Scan(&post.ID, &post.Content, &post.Author)
		if err != nil{
			return
		}
		posts = append(posts, post)
	}
	
	return
}

func (p *Post) GetPost(id int) (post Post, err error){
	post = Post{}

	sql := "select id,content,author from post where id=$1"

	err = Db.QueryRow(sql, id).Scan(&post.ID, &post.Content, &post.Author)

	return
}

func (post *Post) AddPost() (err error){
	sql := "insert into post(content,author) values($1,$2) returning id"

	stmt, err := Db.Prepare(sql)
	if err != nil{
		return
	}

	defer stmt.Close()

	err = stmt.QueryRow(post.Content, post.Author).Scan(&post.ID)

	return
}

func (post *Post) DelPost()(err error){
	sql := "delete from post where id=$1"
	_,err = Db.Exec(sql, post.ID)
	return
}

func (post *Post) EditPost() (err error){
	sql := "update post set content=$1 where id=$2"
	_,err = Db.Exec(sql, post.Content, post.ID)
	return
}

3:main.go

package main

import(
	"fmt"
	"Chapter02/post"
)

func main(){
	p := post.Post{
		Content: "Hello java!",
		Author: "王五",
	}

	fmt.Println(p)

	err := p.AddPost()
	if err != nil{
		panic(err)
	}

	fmt.Println(p)

	var posts = []post.Post{}
	posts, err = p.GetPosts(10)
	if err != nil{
		panic(err)
	}
	for _,post := range posts{
		fmt.Printf("ID:%d,Content:%s,Author:%s\n", post.ID, post.Content, post.Author)
	}

	pp, err := p.GetPost(p.ID)
	if err != nil{
		panic(err)
	}
	fmt.Println(pp)
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值