菜鸟请教个数据库多个关联表插入数据的问题

xiongyejun · 2018-07-11 19:23:35 · 828 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-07-11 19:23:35 的主题,其中的信息可能已经有所发展或是发生改变。

比如有以下2个表:

微信截图_20180711190646.png

  • 表a记录一些基础信息:create table ta (id integer not null primary key autoincrement, name text not null);
  • 表b的aid关联表a的id:create table tb (aid integer not null, t DATE, value DOUBLE not null, primary key(aid,t));

待插入的数据:

type insertData struct {
    name  string
    t     string
    value float64
}

数据插入时:

  1. 如果name在表a中存在,就获取它的id,然后再插入到表b,如果表b已经存在,就更新value
  2. 如果name在表a中不存在,先插入到表a,然后再同上面一样

数据库我用的很少,我能想到的办法就是每一个都去表a里判断是否存在,然后再读取id,或者是插入后再读取id,这样一个一个操作很慢,想学习下有什么好方法解决这种问题?请高手指教,谢谢。

package main

import (
    "database/sql"
    "fmt"
    "os"

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

type insertData struct {
    name  string
    t     string
    value float64
}

type dataStruct struct {
    DBPath string
    db     *sql.DB
}

var d *dataStruct

func init() {
    d = new(dataStruct)
    d.DBPath, _ = os.Getwd()
    d.DBPath += `\test.db`
}

func main() {
    if err := d.getDB(); err != nil {
        fmt.Println(err)
        return
    }
}

// 如何高效的实现
func (me *dataStruct) insertData(data []inserData) {

}

func (me *dataStruct) getDB() (err error) {
    if _, err = os.Stat(d.DBPath); err == nil {
        if me.db, err = sql.Open("sqlite3", d.DBPath); err != nil {
            return
        } else {
            fmt.Println("成功打开数据库。")
            return nil
        }
    } else {
        if me.db, err = sql.Open("sqlite3", d.DBPath); err != nil {
            return
        } else {
            sqlStmt := `create table ta (id integer not null primary key autoincrement, name text not null);`
            if _, err = d.db.Exec(sqlStmt); err != nil {
                return
            } else {
                fmt.Println("成功创建表a。")

                sqlStmt = `create table tb (aid integer not null, t DATE, value DOUBLE not null, primary key(aid,t));`
                if _, err = d.db.Exec(sqlStmt); err != nil {
                    return
                } else {
                    fmt.Println("成功创建表b。")
                    return nil
                }
            }

        }
    }
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

828 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传