MIT6.5830 Lab0-Go tutorial实验记录(二)

news2025/1/18 4:52:07

MIT6.5830 Lab0-Go tutorial实验记录(二) – WhiteNight's Site

标签:Golang, 数据库

在将数据库的数据转换为图表前,我们需要先测试是否能正常访问数据库文件。

写者注

为什么要怎么做?因为这块 非常容易出问题。在handlers中需要我们连接至数据库,并将数据转换为图片呈现在前端的html页面上。
问题在于这里各种报错原因都有,而且在lab0原本的代码上进行调试非常折磨,断点经常要打上一堆。但是由于我是先做完实验,再写的实验报告,所以实验过程中有很多图没截下来。这里只能提供一个大致思路理解了。

实验步骤

新建go项目以测试链接

新建一个go项目,只需要有一个main.go即可。

打开main.go。现在我们需要先试着访问数据库文件。

自己编写也可以,这里我选择用lab0中sqlite_ridership_db中的SQL来做测试。SQL语句很显眼,所以还是不难找的。

先把SQL语句写好,其他的功能待会再补齐。

package main

import (
	_ "github.com/mattn/go-sqlite3"
)

func main() {

	query := `
		SELECT SUM(total_ons)
		FROM rail_ridership
		WHERE season = 'Fall 2017'
			AND time_period_id NOT IN ('time_period_10', 'time_period_11')
			AND line_id = ?
		GROUP BY time_period_id
		ORDER BY time_period_id;
	`

}

“github.com/mattn/go-sqlite3”这东西是一个数据库驱动的包,导入它之后就可以通过GO对sqlite数据库进行操作了。

db, err := sql.Open("sqlite3", "建议使用数据库文件的绝对路径")
if err != nil {
	log.Fatal(err)
}
defer db.Close()
//要养成打开数据库后关闭链接的习惯

此时你的main.go代码应该如下

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/mattn/go-sqlite3"
)

func main() {
	db, err := sql.Open("sqlite3", "c:/Users/LENOVO/Desktop/template/testgo/mbta.sqlite")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()
	query := `
		SELECT SUM(total_ons)
		FROM rail_ridership
		WHERE season = 'Fall 2017'
			AND time_period_id NOT IN ('time_period_10', 'time_period_11')
			AND line_id = ?
		GROUP BY time_period_id
		ORDER BY time_period_id;
	`

}

接下来对db执行些操作才能知道到底有没有成功连接,我们先看看原本在lab0中这个SQL起什么作用。

可以看到,在lab0中Query传入了两个参数。前者我我们要执行的SELECT查询SQL语句。后者则为一个string类型的字符串。

而这个lineId会作为参数传入SQL语句中的”AND line_id =? “中,相当于是”AND line_id=lineId“.

但我们测试总不能也直接用lineId,我们得自己指定lineId=xxxxx。不过这个lineId…没说明是什么,只知道它可能是xx线路的id。但是这个id到底是什么格式,没打注释。那只能翻翻代码看看是啥意思。我们先看看它的定义

还是没说lineId是什么,但我们从这个函数大概能推断出:GetRidership( )接收string类型的 lineId,并返回一个int类型的切片和error。

我们在文件中搜索lineId试试。此时在ridersihp_db_test中我们找到了lineIds

还是没说它是干什么的,但我们知道了lineId应该和这四种颜色有关。我们推测lineId应该就是xxx地铁线路所代表的颜色。

实验步骤

navicat打开数据库文件mbta.sqlite

为了验证lineId和颜色有关,我们查看一下数据库结构。这里使用navicat打开mbta.sqlite。

看到有个lines,还有个rail_ridership,那么会不会lineId表示的是不同地铁线路所表示的颜色呢?但咱对波士顿也没什么了解,波士顿的地铁有几号线,不知道;xx号线用什么颜色表示,不知道。不过不知道也不重要,我们打开lines看看

很明显了,line_id就应该表示的是xx号线,即“x号线的id”。

写者注

做这步只是为了更好的了解自己这次实验到底是在干什么,方便我们后面编写Handlers的具体函数。

实验步骤

补全测试代码

那我们直接假设要查询“red line”这条线路的乘客量。那么把lab0中代码复制过来,再把lineId改成“red”试试,能获取到数据就说明连接是成功的。

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/mattn/go-sqlite3"
)

func main() {
	db, err := sql.Open("sqlite3", "c:/Users/LENOVO/Desktop/template/testgo/mbta.sqlite")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()
	query := `
		SELECT SUM(total_ons)
		FROM rail_ridership
		WHERE season = 'Fall 2017'
			AND time_period_id NOT IN ('time_period_10', 'time_period_11')
			AND line_id = ?
		GROUP BY time_period_id
		ORDER BY time_period_id;
	`
	rows, err := db.Query(query, "green")
	defer rows.Close() //别忘了关闭连接
	fmt.Print(rows)
}

在fmt.Print(rows)那打个断点,方便我们查看变量的情况。调试一下,得到变量信息

error为nil,说明连接过程没出现报错。rows也不为nil,说明rows确实获取到了数据库的数据。

附录

报错原因

在Lab0“连接至数据库”前,你需要确保以下几点:

  • 你电脑有安装gcc,cmd输入gcc -v能显示版本信息。
    • 这是因为sqlite本身的源代码是c编写的。所以要和go一起用的话需要本地有c语言的编译环境。
  • mbta.sqlite有读写权限。
    • 由于mbta.sqlite这个文件是你自己下载下来的。如果你用的是linux,该文件很有可能默认没有读写权限,建议给mbta.sqlite所在的文件夹直接chmod加上权限。如果用的是windows,右键mbta.sqlite打开属性,你大概率会发现该文件提示已被锁定。解除锁定即可。
    • 对于windows,上面这个操作如果最后还是拿不到数据库的数据,cmd输入
      cacls c:/xxx/database /e /t /g everyone:F 。将数据库所在的文件夹设置为所有人可写。应该就能解决问题了。

在测试用的main.go调试的时候,起码err必须是nil。rows之类的得根据你自己编写的SQL语句来看,如果是按Lab0给的实验代码,最后rows不能是nil。如果rows是nil的话只能根据error的信息自己慢慢查报错原因了。

写者注

多打断点多调试,理解代码后在几个go文件里找可能会出错的地方打上断点。我自己光是连接数据库这块打断点+调试就花了一个下午。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机基础知识33

进程基础(操作系统中的概念) 进程它是操作系统总最重要的概念,线程也是 进程和线程都是有操作系统来调度使用的,我们程序员是不能控制的 # 进程和程序是两码事、完全不一样 程序:其实一个死的东西、一堆代码就是程序,它也没有生命…

【5】c++11新特性(稳定性和兼容性)—>override关键字

override关键字很简单,就是起到一个检查的作用,父类中有一个虚函数,子类要去重写这个虚函数,那么在子类重写时,函数后面加上override,就会检查子类中重写的这个函数和父类中这个虚函数名是否一样&#xff0…

FISCO过程中存在的的问题

问题1:端口被占 报错:Exceed waiting time. Please try again to start node0 initConfig for P2PInitializer failed,check Port30303,EINFOThrow location unknown (consider using BOOST_THROW_EXCEPTION) Dynamic exception type: boost::exception_…

80026-044-06-R 数字伺服驱动器提供了更好的配置和性能

80026-044-06-R 数字伺服驱动器提供了更好的配置和性能 由于它们的精密性能,伺服驱动器被用于机器人,自动化,数控加工,甚至在过程中制造半导体. 一些运动控制应用使用模拟伺服驱动器,这是一项久经考验的技术。虽然它…

数据结构之顺序表的模拟实现

💕"世事犹如书籍,一页页被翻过去。人要向前看,少翻历史旧账。"💕 作者:Mylvzi 文章主要内容:数据结构之顺序表的模拟实现 /*** Created with IntelliJ IDEA.* Description:* User: 绿字* Date:…

【EI会议征稿通知】第四届电网系统与绿色能源国际学术会议(PGSGE 2024)

JPCS独立出版-第四届电网系统与绿色能源国际学术会议(PGSGE 2024) 2024 4th International Conference on Power Grid Systems and Green Energy 2024年第四届电网系统与绿色能源国际学术会议(PGSGE 2024) 将于2024年01月05-07日在中国厦门召开。本次会…

【计算机网络】第一章——概述

个人主页直达:小白不是程序媛 系列专栏:计算机网络基础 目录 前言 计算机网络概述 概念 功能 组成 分类 标准化工作 性能指标 速率 带宽 吞吐量 时延 时延带宽积 往返时延RTT 利用率 分层 为什么要分层? 分层的基本原则&am…

【Java实战】创建第一个Springboot项目Hello world

没有旗舰版的Idea授权,所以安装了社区版的idea。不知道从何时开始,社区版IDEA的插件不好用了,所以就换了个方法生成Springboot项目。 一 在线生成 选择好对应的选项后,点击生成就可以下载到一个完整的springboot项目了。 二 使用…

倍福tnzip,tszip,tpzip文件的打开方式

文章目录 一. tnzip的打开方式二. tszip打开方法三. tpzip打开方法 一. tnzip的打开方式 打开项目:选择菜单栏 FILE,点击 Open Solution from Archive…,在弹出的 对话框中选择保存好的文件,单击打开。选择展开此项目的路径&…

处理sass-loader安装失败

Vue项目中安装node-sass跟sass-loader 我们在开发中,经常会使用sass语法来编写css,在安装node-sass和sass-loader时,经常会出现错误(通常是依赖冲突)导致安装失败。因为官方发布的版本号并不是连续的,有些版本与版本之…

【RocketMQ系列六】RocketMQ事务消息

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。 💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精…

海洋CMS仿爱美剧影视电影视频网站模版源码/自适应手机端

海洋CMS仿爱美剧网站模板,自适应手机端,内含视频、资讯、留言模块。 下载地址:https://bbs.csdn.net/topics/617419787

wps/word 之 word中的两个表格 如何合并成为一个表格(已解决)

第一步:新建两个表格: 如何实现上面的两个表格合并呢? 分别选定每个表格,然后鼠标右键---》表格属性 在表格属性中的 表格---》选择 无文字环绕。 第二个表格按照同样的方法 设置 无文字环绕。 然后将中的文本行删去即可以了。选…

金融液冷数据中心,噱头还是趋势?

当前,全社会数字化进程加速,金融行业已全面进入数字化和智能化时代。与此同时,随着云计算、分布式架构、大数据分析、通用人工智能等技术的广泛运用,金融行业从数据大集中到分布式融合,金融企业的数据中心建设正围绕其…

什么是MIMO?

什么是MIMO?从SISO到MIMO - 华为 (huawei.com) MIMO(Multiple-Input Multiple-Output)是指在无线通信领域使用多天线发送和接收信号的技术。MIMO技术主要应用在Wi-Fi(WiFi)领域和移动通信领域,可以有效提高…

Unity之ShaderGraph如何实现光边溶解

前言 今天我们来实现一个最常见的随机溶剂效果。如下图所示: 光边溶解效果: 无光边效果 主要节点 Simple Noise:根据输入UV生成简单噪声或Value噪声。生成的噪声的大小由输入Scale控制。 Step:对于每个组件,如果输…

软件招标测试包含哪些测试?对软件项目起到什么作用?

在当前日益竞争激烈的软件市场中,一款优质的软件产品是企业获得竞争优势的关键。而软件招标测试正是评估软件质量的重要环节。   那么,什么是软件招标测试呢?简单来说,软件招标测试主要是验证软件产品的关键指标是否符合投标书要求。它通过…

多维时序 | MATLAB实现SSA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)

多维时序 | MATLAB实现SSA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制) 目录 多维时序 | MATLAB实现SSA-CNN-GRU-Attention多变量时间序列预测(SE注意力机制)预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述…

中国移动集采120万部,助推国产5G赶超iPhone15

近期媒体纷纷传出消息指中国移动将大规模集采,预计将采购国产5G手机120万台,加上另外两家运营商的集采数量,估计集采数量可能达到300万部,如此将有助于它在国内高端手机市场赶超苹果。 国产5G手机在8月底突然上市,获益…

libportaudio.so.2: cannot open shared object file: No such file or directory

ubuntu安装完pyaudio后报错 ImportError libportaudio.so.2: cannot open shared object file: No such file or directory解决方案 sudo apt-get install libportaudio2 libportaudiocpp0 portaudio19-dev