我在编写iWrite时,设计了一个字典功能,想通过Sqlite提供查字支持。我在GitHub上找到了这个项目,数据是JSON的,有点乱,我又找到一个mdb格式的字典,这些都是Go里处理。

pwxcoo/chinese-xinhua​github.com

在进行之前,请先打包下载pwxcoo/chinese-xinhua,我们需要当中data文件夹的数据。

一、处理VS Code开发Go的几个问题。

  1. Go Tools的安装。

在VS Code会提供示安装gocode之类的工具,在选择“Install All”之后,大概率会安装失败。你可以在Terminal中输入下面内容回车后,重启工程,再“Install All”会成功。

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

安装完成之后,需要改回来,不然你无法使用go get工具,它会出现类似下面的回应。

go get github.com/mattn/go-sqlite3 upgrade
go: github.com/mattn/go-sqlite3 upgrade => v1.14.5

更改回来可通过在Terminal中输入下面语句并回车来实现。

go env -w GO111MODULE=""
go env -w GOPROXY="https://proxy.golang.org,direct"

2. Go 手动安装http://Golang.org/x库。

由于golang.org/x/net相关的库是无法通过get获得的,所以需要手工处理。

get -u golang.org/x/net
unrecognized import path "golang.org/x/net": https fetch: Get "https://golang.org/x/net?go-get=1": dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

处理方式为转为从GitHub中获取,每个一个x库对应一GitHub库,所以可以如下面处理。

$mkdir -p $GOPATH/src/golang.org/x/
$cd $GOPATH/src/golang.org/x/
$git clone https://github.com/golang/net.git net
$go install net

一、新建一个Go工程Zidian。

  • 在Go的src目录中新建一个Zidian文件夹,将打包下载中的data文件夹拖入;
  • 然后VS Code里打开Zidian文件夹,建立一个foo.db文件,这个作为Sqlite的数据库文件;
  • 再建立一个main.go文件,输入以下内容。
package main
func main() {println("Hello World")
}

  • 在Terminal中,确认运行成功。
go run main.go

由于在Go中使用sqlite需要用到第三方库,我们选择了一个并通过Terminal将其加入。

go get github.com/mattn/go-sqlite3

二、将JSON数据转为Sqlite

这些操作均在Go中完成,所以这一节的代码都是写在main.go中。

  • 建立对应的结构体。

注意结构体中属性的首字母要大写,否则在Json解析中因无法被外部访问而形成空值。

// Character 字。
type Character struct {Word        string `json:"word"`Alias       string `json:"oldword"`Strokes     string `json:"strokes"`Pinyin      string `json:"pinyin"`Radicals    string `json:"radicals"`Explanation string `json:"explanation"`More        string `json:"more"`
}// Word 词。
type Word struct {Word        string `json:"ci"`Explanation string `json:"explanation"`
}// Idiom 成语。
type Idiom struct {Word         string `json:"word"`Pinyin       string `json:"pinyin"`Example      string `json:"example"`Explanation  string `json:"explanation"`Derivation   string `json:"derivation"`Abbreviation string `json:"abbreviation"`
}// Allegorical 歇后语。
type Allegorical struct {Riddle string `json:"riddle"`Answer string `json:"answer"`
}

  • 各创建表的语句。

Sqlite支持标准的SQL语句。创建表的主要意思为删除旧的表,再建新的表。

var characterTable = `DROP TABLE IF EXISTS character; CREATE TABLE character (uid         INT(10) NULL,word        TEXT,alias       TEXT,strokes     INTEGER,pinyin      TEXT,radicals    TEXT,explanation TEXT,more        TEXT)
`var wordTable = `DROP TABLE IF EXISTS word; CREATE TABLE word (uid         INT(10) NULL,word        TEXT,explanation TEXT)
`var idiomTable = `DROP TABLE IF EXISTS idiom; CREATE TABLE idiom (uid          INT(10) NULL,word         TEXT,pinyin       TEXT,example      TEXT,explanation  TEXT,derivation   TEXT,abbreviation TEXT)
`var allegoricalTable = `DROP TABLE IF EXISTS allegorical; CREATE TABLE allegorical (uid         INT(10) NULL,riddle         TEXT,answer         TEXT)
`

  • 将JSON数据从文件里读出来,写入到数据库。

先前定义的结构体为当中的载体。

type Pool struct {sql.DB
}// 字
func (db *Pool) characterTable() { // 建表。_, err := db.Exec(characterTable)if err != nil {panic(err)}// 从文件里读JSON。b, err := ioutil.ReadFile("./data/character.json")if err != nil {panic(err)}// 解析为结构数组。var data []Characterif err := json.Unmarshal(b, &data); err != nil {panic(err)}// 逐行写入。for k, v := range data {_, err := db.Exec("INSERT INTO character (`uid`, `word`, `alias`, `strokes`, `pinyin`, `radicals`, `explanation`, `more`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", k, v.Word, v.Alias, v.Strokes, v.Pinyin, v.Radicals, v.Explanation, v.More)if err != nil {panic(err)}println("*", k, v.Word)}
}// 词
func (db *Pool) wordTable() {_, err := db.Exec(wordTable)if err != nil {panic(err)}b, err := ioutil.ReadFile("./data/word.json")if err != nil {panic(err)}var data []Wordif err := json.Unmarshal(b, &data); err != nil {panic(err)}for k, v := range data {_, err := db.Exec("INSERT INTO word (`uid`, `word`, `explanation`) VALUES (?, ?, ?)", k, v.Word, v.Explanation)if err != nil {panic(err)}println("*", k, v.Word)}
}// 成语。
func (db *Pool) idiomTable() {_, err := db.Exec(characterTable)if err != nil {panic(err)}b, err := ioutil.ReadFile("./data/idiom.json")if err != nil {panic(err)}var data []Idiomif err := json.Unmarshal(b, &data); err != nil {panic(err)}for k, v := range data {_, err := db.Exec("INSERT INTO idiom (`uid`, `word`, `pinyin`, `example`, `explanation`, `derivation`, `abbreviation`) VALUES (?, ?, ?, ?, ?, ?, ?)", k, v.Word, v.Pinyin, v.Example, v.Explanation, v.Derivation, v.Abbreviation)if err != nil {panic(err)}println("*", k, v.Word)}
}// 歇后语。
func (db *Pool) allegoricalTable() {_, err := db.Exec(allegoricalTable)if err != nil {panic(err)}b, err := ioutil.ReadFile("./data/allegorical.json")if err != nil {panic(err)}var data []Allegoricalif err := json.Unmarshal(b, &data); err != nil {panic(err)}for k, v := range data {_, err := db.Exec("INSERT INTO allegorical (`uid`, `riddle`, `answer`) VALUES (?, ?, ?)", k, v.Riddle, v.Answer)if err != nil {panic(err)}println("*", k, v.Riddle)}
}

连接Sqlite数据库,并执行。

func main() {// 建立连接池。db, err := sql.Open("sqlite3", "./foo.db")if err != nil {panic(err)}var pool Poolpool.DB = *db// 执行。pool.characterTable()pool.wordTable()pool.idiomTable()pool.allegoricalTable()
}

三、Microsoft Access转Sqlite。

如果电脑上没有安装Access的话,需要安装Access驱动,请Windows 64位系统的用户下载

AccessDatabaseEngine_X64.exe

并安装。

Download Microsoft Access Database Engine 2010 Redistributable from Official Microsoft Download Center​www.microsoft.com

  1. 配置ODBC.
  • 打开控制面板中的管理工具,再打开ODBC 数据源(64 位)。
  • 在用户DSN中添加Microsoft Access Driver (*mdb, *.accdb)。
  • Data Source Name 项填上zidian;点击Select...;找到zidian.mdb,确定。
  • 最终配置显示如下。
  • zidian.mdb也是在网上下载的,结构如下。

2. 在Go中处理*.mdb格式。

  • 使用ODBC来访问*.mdb格式。
go get github.com/alexbrainman/odbc

  • 读*.mdb取并写入Sqlite。
var charTable = `DROP TABLE IF EXISTS char; CREATE TABLE char (uid         INT(10) NULL,word        TEXT,alias       TEXT,strokes     INTEGER,pinyin      TEXT,radicals    TEXT,explanation TEXT,more        TEXT)
`
func (db *Pool) accessDb() {_, err := db.Exec(charTable)if err != nil {panic(err)}// 打开系统定义的DSN。mdb, err := sql.Open("odbc", "DSN=zidian")if err != nil {panic(err)}defer mdb.Close()// 读。rows, err := mdb.Query("SELECT id, zi, pinyin, bushou, bihua, jijie, xiangjie FROM xhzd_surnfu")if err != nil {panic(err)}for rows.Next() {var k intvar v Charactererr := rows.Scan(&k, &v.Word, &v.Pinyin, &v.Radicals, &v.Strokes, &v.Explanation, &v.More)if err != nil {panic(err)}// 写。_, err = db.Exec("INSERT INTO character (`uid`, `word`, `alias`, `strokes`, `pinyin`, `radicals`, `explanation`, `more`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", k, v.Word, v.Alias, v.Strokes, v.Pinyin, v.Radicals, v.Explanation, v.More)if err != nil {panic(err)}println("*", k, v.Word)}
}func main() {db, err := sql.Open("sqlite3", "./foo.db")if err != nil {panic(err)}var pool Poolpool.DB = *dbpool.accessDb()
}

两种处理到这里都结束了。

让我们在这里,遇见明天的自己!姜友华

go get如何删除_在Go使用Sqlite和Accsee相关推荐

  1. indesign选中不了图片删除_图片神器XnView教程、方法和技巧汇总

    编者按 关于XnView的介绍和概况参阅<「神级图片软件 XnView 解析」XnView MP 和 XnView 哪个好>. 在写完上面这篇文章之后,想整理一些方法和技巧给不太熟悉XnV ...

  2. 2007数据透视表如何删除_删除数据透视表标题中的总和

    2007数据透视表如何删除 When you're building a pivot table, if you add fields to the Values area, Excel automa ...

  3. java treeset 删除_删除Java TreeSet中的最高元素

    要删除最高元素,请使用pollLast()方法. 创建一个TreeSet并向其中添加元素-TreeSet tSet = new TreeSet(); tSet.add("78"); ...

  4. mysql根据当前时间删除_从日期时间早于另一项日期时间的Mysql表中删除

    我有一些困难,使我的MySQL查询正确.当前状态如下: 我有一个包含Todo的表,其中datetime字段已更改为(在插入/更新时设置为当前datetime) 如果有20个以上的项目的"是否 ...

  5. 红黑树+java+删除_红黑树深入剖析及Java实现

    红黑树是平衡二叉查找树的一种.为了深入理解红黑树,我们需要从二叉查找树开始讲起. BST 二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,它的左子节点的值比父节点的值要小, ...

  6. java foreach 删除_为什么java不要在foreach循环里进行元素的remove/add操作

    首先,这涉及多线程操作,Iterator是不支持多线程操作的,List类会在内部维护一个modCount的变量,用来记录修改次数 举例:ArrayList源码 protected transient ...

  7. mfc removemenu 静态菜单 删除_循序渐进的升级,静态体验新款奥迪 A4L

    导读:循序渐进的升级,静态体验新款奥迪 A4L 各位点开这篇文章的朋友们,想必都是很高的颜值吧,我们真的是很有缘哦,小编每天都会给大家带来不一样的汽车资讯,如果对小编的文章或者其他的什么,有什么一些意 ...

  8. sql 将多个括号及内容删除_新浪微博将对逝者账号设置保护:不能登录、新发和删除内容...

    新浪微博社区管理官方微博截图 中国网9月17日讯 据新浪微博社区管理官方微博"微博管理员"今日消息,为了完善平台服务,保障用户权益,保护逝者隐私,防止逝者账号被盗,站方将对逝者账号 ...

  9. 单链表的插入和删除_从0开始的编程之梦——数据结构之单链表的基本运算

    一.求带有头结点的单链表长度 算法思路:沿带头节点单链表L的首元结点计数统计单链表长度 算法描述: 顺链头开始,计数器j初值为0:当前指针p指向链表L的首元结点 p=L->next p依次往后( ...

最新文章

  1. :src 三目运算
  2. CSLA.Net 3.0.5 版本 教学程序,代码附教学注释
  3. Meta http-equiv 大全
  4. 什么是条件组合覆盖_什么是综合评价?高中生报名有哪些好处?
  5. Resource Monitor的使用和理解
  6. 从程序员到架构师——踏上架构旅途 思考从未止步
  7. 10.25模拟 列车调度
  8. Envi辐射定标及大气校正
  9. android屏幕投影到pc,安卓手机怎么把屏幕投影到电脑上
  10. DAS、NAS、SAN三种存储架构比较
  11. 泰克TDS3054B示波器技术指标
  12. 微信小程序实战--仿知识星球(一)
  13. 剑指offe面试题8 旋转数组的最小数字 (java实现)
  14. 用计算机的拓展活动总结,计算机学院心理健康节素质拓展活动圆满结束
  15. 分布式系统的解决方案,学好这个就够了
  16. 百度员工离职总结:资质平庸的人该怎么办?震惊了无数人!
  17. 10060 mysql_连接MySQL错误:Can't connect to MySQL server (10060)
  18. 商人的诀窍 结构体
  19. MDK-ARM V5.28的Bug被修复了吗?
  20. 计算机数据科学读书报告,计算机体系结构读书报告.doc

热门文章

  1. 深入解析:MySQL对分布式事务 XA Transactions 的支持
  2. 数据恢复 - ORA-600 18018错误的重现和修复
  3. 一起玩转LiteOS组件:Pixman
  4. 我的编辑器能玩贪吃蛇,一起玩不?
  5. 自从安上了“AI”,这些商务经理天天按时下班了
  6. 这5个让人窒息的烂代码,你看完都忍不了!
  7. 【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式
  8. Spring IOC容器和Bean的配置
  9. LeetCode-118杨辉三角C++详解
  10. vim插件管理器minpac安装及使用