家里装了智能门铃、摄像头和温湿度传感器,时间一长,设备上报的数据越来越多。光靠记事本或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("数据已写入")
用Prepare和Exec配合,既能防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稳定可靠,用来管家庭网络设备的数据,完全够用。不用上云,数据留在家里,更安心。