数码工坊
白蓝主题五 · 清爽阅读
首页  > 家庭网络

用Go语言操作MySQL:家庭网络设备数据管理的小帮手

家里装了智能门铃、摄像头和温湿度传感器,时间一长,设备上报的数据越来越多。光靠记事本或Excel已经管不过来了,干脆搭了个小型本地数据库,把数据存进去,方便查也方便分析。选来选去,用了MySQL,搭配Go语言写个小程序定时收集数据,简单又高效。

先装依赖,别急着写代码

Go本身不带数据库驱动,得先引入MySQL的驱动包。打开终端,运行这行命令:

go get -u github.com/go-sql-driver/mysql

这个包是社区常用的选择,稳定,文档也全。导入之后,在代码里就能通过database/sql接口和MySQL打交到了。

连上你的数据库

假设你已经在家里NAS或者一台旧电脑上装好了MySQL服务,账号密码设的是home:123456,数据库叫home_iot。连接代码可以这么写:

package main

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    dsn := "home:123456@tcp(192.168.1.100:3306)/home_iot"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // 测试是否连得通
    if err = db.Ping(); err != nil {
        panic(err)
    }
    
    println("数据库连接成功")
}

这里的IP地址是你MySQL服务器在局域网里的地址,端口默认3306。连通后就可以开始读写数据了。

往数据库写入传感器数据

比如你家阳台有个温湿度传感器,每分钟上报一次。可以建一张表:

CREATE TABLE sensor_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    location VARCHAR(50),
    temperature DECIMAL(4,1),
    humidity DECIMAL(4,1),
    record_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

然后用Go插入一条记录:

stmt, err := db.Prepare("INSERT INTO sensor_data(location, temperature, humidity) VALUES(?, ?, ?)")
if err != nil {
    panic(err)
}
defer stmt.Close()

_, err = stmt.Exec("阳台", 26.5, 63.2)
if err != nil {
    panic(err)
}

println("数据已写入")

PrepareExec配合,既能防SQL注入,又适合频繁插入的场景。

查数据也一样简单

想看看昨天阳台的平均温度?用Query就行:

rows, err := db.Query("SELECT AVG(temperature) FROM sensor_data WHERE location = ? AND DATE(record_time) = CURDATE() - INTERVAL 1 DAY", "阳台")
if err != nil {
    panic(err)
}
defer rows.Close()

var avgTemp float64
for rows.Next() {
    err := rows.Scan(&avgTemp)
    if err != nil {
        panic(err)
    }
    println("昨天平均温度:", avgTemp)
}

这样查出来的数据,还能推送到手机通知,或者画成小图表贴在客厅屏幕上,家人一眼就看得明白。

Go语言轻量,编译完的程序直接扔进树莓派就能跑,不吃资源。加上MySQL稳定可靠,用来管家庭网络设备的数据,完全够用。不用上云,数据留在家里,更安心。