
本例基本实现了一个动态网站所需要的结构,包括目录基础结构,数据库连接和查询,模板解析,模板内显示和控制数据等最常用的操作,以后的文章会继续深入和细化网站实现的细节,但只在某一功能的实现上深入讨论,不再完整的列出程序结构和源代码清单,如果文章开头引用本篇,则是以本程序为基础结构的。
先建立以下目录结构和go源码文件:
main |- sqltools |- connmysql.go |- static |- css |- main.css |- templates |- index.html |- main.go
mian文件夹中是main.go文件和sqltools文件夹,sqltools文件夹中是connmysql.go文件,我们把数据库连接相关代码单独放在connmysql.go文件中,方便以后调用,main.go中调用connmysql.go中的数据库连接方法。
执行go mod命令自动生成go.mod,在命令提示行cmd进入main目录,执行以下命令:
go mod init main
从github.com下载mysql数据库的go驱动,golang连接数据库用户的驱动是:go-sql-driver。
在命令提示行cmd进入main目录下,执行以下命令:
go get -u github.com/go-sql-driver/mysql
成功执行后会将mysql驱动写入到go.mod文件中。
在数据库golang里面新建test数据库,并写入几行数据,可运行如下SQL语句:
CREATE TABLE IF NOT EXISTS `test` ( `id` int(8) NOT NULL, `content` varchar(512) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- 转存表中的数据 `test` -- INSERT INTO `test` (`id`, `content`) VALUES (0, '测试查询'), (1, '欢迎光临'), (2, '连接MySQL'), (3, 'Go微型服务'), (4, '这里是RGNote'), (5, '学习GoLang');
下面是connmysql.go文件的源码内容:
package sqltools import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func ConnectMySQL(dbUser, dbPassword, dbServer, dbName string) (db *sql.DB, err error) { //生成数据库连接字符串 str := dbUser + ":" + dbPassword + "@(" + dbServer + ":3306)/" + dbName //打印生成的字符串 fmt.Println("数据库连接字符串:" + str) //建立连接 db, err = sql.Open("mysql", str) //测试连接是否成功 err = db.Ping() //返回数据库连接 return db, err } func QueryTable(db *sql.DB, tableName string) (rows *sql.Rows, err error) { str := "select * from " + tableName rows, err = db.Query(str) return rows, err }
下面是main.go源代码:
package main import ( "fmt" "log" "main/sqltools" "net/http" "text/template" ) //数据库连接参数 const ( dbUser = "root" dbPassword = "123456" dbServer = "127.0.0.1" dbName = "golang" ) type Msg struct { //变量名称要大写,小写变量名只能在本程序访问,不能传值到网页页面,不会输出内容 Id string Content string } func main() { //指定相对路径./static为文件服务路径,并指定js、css、img文件目录 staticHandle := http.FileServer(http.Dir("./static")) http.Handle("/js/", staticHandle) http.Handle("/css/", staticHandle) http.Handle("/img/", staticHandle) http.HandleFunc("/", handler) fmt.Println("正在启动Web服务,端口8000") log.Fatal(http.ListenAndServe("localhost:8000", nil)) } func handler(w http.ResponseWriter, r *http.Request) { db, err := sqltools.ConnectMySQL(dbUser, dbPassword, dbServer, dbName) if err == nil { fmt.Println("数据库连接成功") } else { fmt.Println("数据库连接失败,请查询参数") } t, _ := template.ParseFiles("./templates/index.html") //新建空map用于存储数据库查询结果 newsMsg := make(map[int]Msg) //新建msg结构用于存储查询结果内容 var msg Msg //用于map Key值 newsId := 1 //查询数据库 rows, rowsErr := sqltools.QueryTable(db, "test") if rowsErr != nil { fmt.Printf("查询失败") } else { //获取数据 for rows.Next() { var sid string var content string rows.Scan(&sid, &content) msg.Content = content msg.Id = sid newsMsg[newsId] = msg newsId++ } fmt.Println(newsMsg) } t.Execute(w, newsMsg) }
index.html文件内容如下:
<html> <head> <title>Go语言实现一个带数据库和模板的功能完整的网站</title> <link rel="stylesheet" href="/css/main.css" type="text/css"> </head> <body> <div class="wraper"> <div> <div class="sn_row datatitle" >行号</div> <div class="sn_row datatitle">编号</div> <div class="sn_row data_row datatitle">内容</div> </div> {{range $index, $user:=.}} <div class="databody"> <div class="sn_row">{{$index}}</div> <div class="sn_row">{{$user.Id}}</div> <div class="sn_row data_row">{{$user.Content}}</div> </div> {{end}} </div> </body> </html>
main.css文件内容如下:
body { background-color:#d0d0d0; } .wraper{ width:380px; line-height: 30px; margin:0 auto; margin-top: 20px; } .databody{ text-align: left; text-indent: 10px; } .sn_row{ float:left; width:80px; border:1px; border-style:solid; border-color: black; background-color:ghostwhite; } .data_row{ width:200px; } .datatitle{ text-align: center; font-weight: bold; color:green; font-size:larger; background-color:khaki; }
本机配置好mysql程序,并新建golang数据库,执行以下命令:
go run main.go
设置正确的数据库参数,打开浏览器,在地址栏输入http://localhost:8000,如果成功执行,则输出:
正在启动Web服务,端口8000 数据库连接字符串:root:123456@(127.0.0.1:3306)/golang 数据库连接成功 map[1:{0 测试查询} 2:{1 欢迎光临} 3:{2 连接MySQL} 4:{3 Go微型服务} 5:{4 这里是RGNote} 6:{5 学习GoLang}]
此时,浏览器显示以下页面:

将密码改为123,则数据库连接失败,则输出:
数据库连接字符串:root:123@(127.0.0.1:3306)/golang 数据库连接失败,请检查参数
以上代码在go 1.16.3调试通过。
原创文章,作者:AukCode,如若转载,请注明出处:https://www.archeCode.Com/go-language-realizes-a-website-infrastructure-with-database-and-template-functions.html