源码地址: https://github.com/JianBiHua/go_line_chat
说了有数据库的,开始喽
Sqlit3Impl.go
package sql
import (
"GoWorkspace/go_line_chat/src/server/chatlog"
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
)
// Sqlite3Impl is sqlite3 impl
type Sqlite3Impl struct {
db *sql.DB
}
// NewSqlite3Impl is static create sqlite3 impl
func NewSqlite3Impl() *Sqlite3Impl {
var s = new(Sqlite3Impl)
return s
}
// log is show log when Chat mode is SqlMode
func (s *Sqlite3Impl) log(msg string) {
chatlog.Append(chatlog.LOGSQL, msg)
}
// Open 打开数据库,并创建表
//
// out:
// error: 打开数据库时的错误。
func (s *Sqlite3Impl) Open(path string) error {
// 打开数据库
var err error
s.db, err = sql.Open("sqlite3", path)
if err == nil {
s.log("Sqlite3 Is Open")
} else {
s.log(fmt.Sprintf("Open sqlite3 error: %v", err))
}
return err
}
// Close 关闭数据库
func (s *Sqlite3Impl) Close() {
s.log("Sqlite3 Is Closed")
s.db.Close()
}
// createTable is 创建数据表
// func (s *Sqlite3Impl) createTable() {
// var err error
// err = createTable(SQLCommandUser)
// s.log(fmt.Sprintf("error: %v, %s", err, SQLTableUser))
// err = createTable(SQLCommandUserChatGroup)
// s.log(fmt.Sprintf("error: %v, %s", err, SQLTableChatGroup))
// err = createTable(SQLCommandUserChatGroupMember)
// s.log(fmt.Sprintf("error: %v, %s", err, SQLTableChatGroupMember))
// err = createTable(SQLCommandUserChatMsg)
// s.log(fmt.Sprintf("error: %v, %s", err, SQLTableChatMsg))
// err = createTable(SQLCommandFriends)
// s.log(fmt.Sprintf("error: %v, %s", err, SQLTableFriends))
// }
func (s *Sqlite3Impl) createTable(cmd string) error {
_, err := s.db.Exec(cmd)
return err
}
// UpdateOrDelete is run sql command
//
// Example:
//
// delete:
// err := UpdateOrDelete(fmt.Spintf("DELETE FROM UserTable1 WHERE id=?", id))
//
// update:
// err := UpdateOrDelete(fmt.Spintf("UPDATE UserTable1 SET userName=%s,password=%s WHERE id=%d", "user2", "password2", id)
//
func (s *Sqlite3Impl) UpdateOrDelete(prepare string, param ...interface{}) (int64, error) {
//插入数据
stmt, err := s.db.Prepare(prepare)
if err != nil {
return -1, err
}
defer stmt.Close()
res, err := stmt.Exec(param)
if err != nil {
return -1, err
}
id, err := res.RowsAffected()
if err != nil {
return -1, err
}
return id, err
}
// Insert is
func (s *Sqlite3Impl) Insert(prepare string, param ...interface{}) (int64, error) {
//插入数据
stmt, err := s.db.Prepare(prepare)
if err != nil {
return -1, err
}
defer stmt.Close()
res, err := stmt.Exec(param)
if err != nil {
return -1, err
}
id, err := res.LastInsertId()
if err != nil {
return -1, err
}
return id, err
}
// Get is get data base
//
// Example:
// var cmd = fmt.Sprintf("SELECT id,userName,password FROM UserTable1 WHERE id=%d", user.id)
// err := Get(cmd, func(p ...interface{}){
// for key, value := range param {
// fmt.Print("", key, value)
// }
//}, &userName, &password)
//
func (s *Sqlite3Impl) Get(cmd string, f func(...interface{}), param ...interface{}) error {
rows, err := s.db.Query(cmd)
if err != nil {
s.log(fmt.Sprintf("Get error : %v", err))
return err
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(param)
if err != nil {
s.log(fmt.Sprintf("Get error : %v", err))
return err
}
f(param)
}
return nil
}
这个代码基本都是百度的,拿来封装了下.
这个不是我们的核心,因为这个真没什么东西,就是一个简单的sqlite3的操作
为啥要用sqlite3呢?
- 因为这个库简单呀,系统自带,不用安装。
- 不用配置
- 同样可以学习数据库的知识(sql语句)
核心来了sqlCommon.go
这个才是重点;
- 定义了五个数据库。
- 定义了功能;注册/创建聊天组/添加删除组员/添加好友/
package sql
// sql names define
const (
// 数据库名称
SQLDataBaseName = "LineChat.db"
// 用户表
//
// 用来保存用户的信息,用户名密码等.
SQLTableUser = "ChatUser"
// 聊天组表
//
// 用来保存用户聊天组的信息。
SQLTableChatGroup = "ChatGroup"
// 聊天组表
//
// 用来保存用户聊天组组员的信息。
SQLTableChatGroupMember = "ChatGroupMember"
// 聊天内容信息表
//
// 用来保存各组的聊天信息的表.
SQLTableChatMsg = "ChatMsg"
// 好友信息表
//
// 用来保存好友信息的表.
SQLTableFriends = "ChatFriends"
)
// create database and tables sql command
const (
// create User Table's sql command
//
// table member item info:
// id :
// userName : 用户名
// password : 密码
// sex : 性别
// name : 显示的名称
// age : 年龄
// icon : 头像路径
// signature : 个性签名
// joinDate : 创建日期时间
// lastDate : 最后一次登陆日期时间
// status : 当前状态, 0: 离线 1: 在线 2: 隐身 3: 免打扰 等等..
SQLCommandUser = "CREATE TABLE IF NOT EXISTS " + SQLTableUser +
`(
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"userName" varchar(30) unique,
"password" varchar(30),
"sex" int(2) default 0,
"name" varchar(20) NULL,
"age" TIMESTAMP default (datetime('now', 'localtime')) ,
"icon" varchar (200) NULL,
"signature" varchar (500) NULL,
"joinDate" TIMESTAMP default (datetime('now', 'localtime')),
"lastDate" TIMESTAMP default (datetime('now', 'localtime')),
"status" int(5) default 0
);
` +
"CREATE INDEX IF NOT EXISTS User ON " + SQLTableUser + "(userName);"
// create User Chat Group Table's sql command
//
// table member item info:
// id :
// name : 组名称。
// signature: 组介绍,个性签名
// max: 最大个数
// icon: 图标路径
// createDate: 创建时间
// type: 组类型,0: 一对一, 1:群(qq) 2:讨论组(qq),3: 公众号 ...等等
SQLCommandUserChatGroup = "CREATE TABLE IF NOT EXISTS " + SQLTableChatGroup +
`(
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"name" varchar(20) default NULL,
"signature" varchar(500) default NULL,
"max" int(8) default 100,
"type" int(8) default 0,
"icon" varchar(200) default NULL,
"createDate" TIMESTAMP default (datetime('now', 'localtime'))
);
`
// create User Chat Group member Table's sql command
//
// table member item info:
// id :
// userName : 用户名。
// joinDate: 进入组时间。
SQLCommandUserChatGroupMember = "CREATE TABLE IF NOT EXISTS " + SQLTableChatGroupMember +
`(
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"groupId" INTEGER,
"userName" varchar(30) not null,
"joinDate" TIMESTAMP default (datetime('now', 'localtime'))
);
` +
"CREATE INDEX IF NOT EXISTS MemberUser ON " + SQLTableChatGroupMember + "(userName);" +
"CREATE INDEX IF NOT EXISTS MemberGroupId ON " + SQLTableChatGroupMember + "(groupId);"
// create User Chat Group member Table's sql command
//
// table member item info:
// id :
// userName : 发送消息的用户。
// sendDate: 发送的时间。
// comment: 发送的内容, 可能是文件,或者图片路径或者网页路径等。
// type: 消息类型: 0: text 1: picture 2: audio 3: video 4: web page,5: 添加好友
SQLCommandUserChatMsg = "CREATE TABLE IF NOT EXISTS " + SQLTableChatMsg +
`(
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"userName" varchar(30) not null,
"sendDate" TIMESTAMP default (datetime('now', 'localtime')),
"comment" TEXT,
"type" int default 0
);
` +
"CREATE INDEX IF NOT EXISTS MsgUser ON " + SQLTableChatMsg + "(userName);"
// create User Friends Table's sql command
//
// table friends info:
// id :
// userName1: user 1
// userName2: user 2
// joniDate: 成为好友的时间。
SQLCommandFriends = "CREATE TABLE IF NOT EXISTS " + SQLTableFriends +
`(
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"userName1" varchar(30) not null,
"userName2" varchar(30) not null,
"joniDate" TIMESTAMP default (datetime('now', 'localtime'))
);
` +
"CREATE INDEX IF NOT EXISTS FriendsUser ON " + SQLTableFriends + "(userName1, userName2);"
)