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

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 mainimport (_ "github.com/mattn/go-sqlite3"
)func main() {query := `SELECT SUM(total_ons)FROM rail_ridershipWHERE season = 'Fall 2017'AND time_period_id NOT IN ('time_period_10', 'time_period_11')AND line_id = ?GROUP BY time_period_idORDER 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 mainimport ("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_ridershipWHERE season = 'Fall 2017'AND time_period_id NOT IN ('time_period_10', 'time_period_11')AND line_id = ?GROUP BY time_period_idORDER 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 mainimport ("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_ridershipWHERE season = 'Fall 2017'AND time_period_id NOT IN ('time_period_10', 'time_period_11')AND line_id = ?GROUP BY time_period_idORDER 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.rhkb.cn/news/163996.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

https证书配置(nginx)

HTTPS 是什么 HTTPS 是一种应用层协议,是一种透过计算机网络进行安全通信的传输协议,HTTPS 经由 HTTP 进行通信,但是在 HTTP 的基础上引入了一个加密层,使用 SSL/TLS 来加密数据包,HTTPS 开发的主要目的,是…

作用域和作用域链

概述 本文将讲解作用域的形成和应用,并且在这基础上简单讲解for循环中的let创建的块级作用域原理。 一,作用域 1.1,作用域的概念 作用域是指在程序中定义变量的区域,该位置决定了变量的生命周期。 function testFn(){var a1 …

Zookeeper 和 Kafka 工作原理及如何搭建 Zookeeper集群 + Kafka集群

目录 1 Zookeeper 1.1 Zookeeper 定义 1.2 Zookeeper 工作机制 1.3 Zookeeper 特点 1.4 Zookeeper 数据结构 1.5 Zookeeper 应用场景 1.6 Zookeeper 选举机制 2 部署 Zookeeper 集群 2.1 安装前准备 2.2 安装 Zookeeper 3 Kafka 3.1 为什么需要消息队列(…

SSH连接华为交换机慢

ssh连接交换机慢是因为交换计算密钥算法阶段默认使用安全性更高的秘钥,由于性能问题导致连接比较慢,如一台华为S5735S-L24T4S-QA2的交换机默认使用如下秘钥,安全行由高到低。 ssh server key-exchange dh_group16_sha512 dh_group15_sha512 …

Redux详解(二)

1. 认识Redux Toolkit Redux Toolkit 是官方推荐的编写 Redux 逻辑的方法。 通过传统的redux编写逻辑方式,会造成文件分离过多,逻辑抽离过于繁琐(具体可看上篇文章 Redux详解一),React官方为解决这一问题,推…

HCIP静态路由综合实验

题目: 步骤: 第一步:搭建上图所示拓扑; 第二步:为路由器接口配置IP地址; R1: [R1]display current-configuration intinterface GigabitEthernet0/0/0ip address 192.168.1.1 255.255.255.252 interfa…

【试题026】赋值运算符小例题

1.题目&#xff1a;设int x100;表达式x%2(x1)%2的值是&#xff1f; 2.代码解析&#xff1a; #include <stdio.h> int main() {//设int x100;表达式x%2(x1)%2的值是&#xff1f;int x 100,y,c;printf("y%d\n", (y(x 1) % 2));c x % 2;printf("c1%d\n&…

全球二氧化碳排放数据1deg产品(ODIAC)数据

简介 全球二氧化碳排放数据1deg产品(ODIAC)是一个空间分辨率为1deg*1deg的全球化石燃料燃烧产生的二氧化碳空间分布产品。它率先将基于空间的夜间灯光数据与单个发电厂的排放/位置相结合来估计化石燃料二氧化碳的排放。该产品被国际研究界广泛用于各种研究应用&#xff08;例如…

前端(十九)——vue/react脚手架的搭建方式

&#x1f604;博主&#xff1a;小猫娃来啦 &#x1f604;文章核心&#xff1a;前端&#xff08;十九&#xff09;——vue/react脚手架的搭建方式 文章目录 前言Vue脚手架搭建方法Vue CLI脚手架Vite脚手架其他方式 React脚手架搭建方法Create React App脚手架Vite脚手架其他方式…

音频抓取代码示例

以下是一个使用DefaultsKit库的简单爬虫程序&#xff0c;用于爬取音频。代码中使用了https://www.duoip.cn/get_proxy的API获取代理服务器。 import Foundation import DefaultsKit ​ let url "https://www.douban.com/music" // 目标网站URL let proxyUrl "…

02、Python ------- 简单爬取下载小视频

简单爬取小视频 1、装模块 按键盘 winr 输入cmd , 输入命令&#xff1a; pip install requests 也有说在这个目录下面执行命令 pip install requests 执行失败 执行如果失败&#xff0c;在命令后面添加镜像 pip install requests -i https://mirrors.aliyun.com/pypi/sim…

linux java 环境变量配置

前提已经存在jdk部署包&#xff0c;并且上传到服务器上 编辑&#xff1a;/etc/profile export JAVA_HOME/home/jdk1.8.0_211/ export JRE_HOME/home/jdk1.8.0_211/jre/ export PATH$JAVA_HOME/bin:$JRE_HOME/bin:$PATH编辑位置&#xff1a; 之后source /etc/profile 查看java…

Kingbase备份与还原及表的约束(Kylin)

备份与还原 逻辑备份是对整个数据库好数据库中的部分对象利用逻辑备份工具导出数据到备份文件在需要数据恢复的情况下利用逻辑还原工具把备份文件恢复到数据库中 使用场景 逻辑备份主要用于数据库逻辑错误的恢复&#xff0c;恢复后对其他数据没有太大影响逻辑备份可用于在大…

Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务

Nmap端口服务 之 CentOS7 关于启动Apache(httpd)服务、telnet服务、smtp服务、ftp服务、sftp服务 一. CentOS7 安装配置SFTP服务器详解一、SFTP简介二、关闭防火墙三、安装SSH服务在CentOS7中,sftp只是ssh的一部分,所以采用yum来安装ssh服务即可1. 查看是否已经安装了ssh2.…

数据挖掘(6)聚类分析

一、什么是聚类分析 1.1概述 无指导的&#xff0c;数据集中类别未知类的特征&#xff1a; 类不是事先给定的&#xff0c;而是根据数据的相似性、距离划分的聚类的数目和结构都没有事先假定。挖掘有价值的客户: 找到客户的黄金客户ATM的安装位置 1.2区别 二、距离和相似系数 …

Linux实用指令-指定运行级别、帮助指令

一、 指定运行级别 1.运行级别说明&#xff1a; 0:关机 1:单用户[找回丢失密码] 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重启 常用运行级别是3和5&#xff0c;要修改默认的运行级别。可改文件/etc/inittab 的id:5:initd…

Spring学习笔记(2)

Spring学习笔记&#xff08;2&#xff09; 一、Spring配置非定义Bean1.1 DruidDataSource1.2、Connection1.3、Date1.4、SqlSessionFactory 二、Bean实例化的基本流程2.1 BeanDefinition2.2 单例池和流程总结 三、Spring的bean工厂后处理器3.1 bean工厂后处理器入门3.2、注册Be…

Dreambooth工作原理

什么是Dreambooth 中文名&#xff1a;梦想亭。 Dreambooth 由 Google 研究团队于 2022 年发布&#xff0c;是一种通过向模型注入自定义主题来微调扩散模型&#xff08;如稳定扩散&#xff09;的技术。 所谓自定义主体&#xff0c;就是一张照片&#xff0c;但是照片主体要鲜明…

idea启动vue项目:Error:0308010C:digital envelope routines::unsupported

此问题是因为Node.js的版本原因&#xff0c;此处安装的Node.js是最新长期维护版: 18.16.0 (includes npm 9.5.1) 有两种解决办法&#xff1a; #1、方法一 重新安装低版本的node.js#2、方法二 在package.json文件中进行配置【此种方法较简单】介绍一下第二种方法&#xff1a; …

win32汇编-使用子程序

当程序中相同功能的一段代码用得比较频繁时&#xff0c;可以将它分离出来写成一个子程序&#xff0c;在主程序中用call指令来调用它。这样可以不用重复写相同的代码&#xff0c; 仅仅用call指令就可以完成多次同样的工作了。Win 32汇编中的子程序也采用堆栈来传递参数&#xff…