如何使用sqlite3存储二维数组?
SQLite3存储二维数组实现方案
针对你从Excel提取、后续供matplotlib使用的二维数组场景,有两种成熟实现方案:
方案1:JSON序列化整体存储(推荐,代码量最低)
这种方案直接利用JSON的序列化能力处理二维数组结构,不需要你手动拼接/解析字符串,完美解决二维数组转存复杂的问题,适合只需要整体存取数组、不需要对数组内元素做SQL条件查询的场景。
实现步骤
- 存储时:用Python内置的
json模块将二维数组直接序列化为JSON字符串,存入SQLite的TEXT类型字段 - 读取时:将取出的JSON字符串反序列化为Python列表,直接可传入matplotlib使用
代码示例
import sqlite3 import json # 你的示例二维数组 exp_data = [ ['', 6.0, 8.0, 10.0, 12.0, 14.0], ['IB=4', 0.143, 0.146, 0.152, 0.158, 0.167], ['IB=8', 0.415, 0.425, 0.43, 0.44, 0.45], ['IB=10', 0.545, 0.555, 0.57, 0.58, 0.59], ['IB=12', 0.766, 0.778, 0.79, 0.81, 0.83] ] # 连接数据库 conn = sqlite3.connect('experiment.db') cur = conn.cursor() # 建表 cur.execute('''CREATE TABLE IF NOT EXISTS exp_data_store (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT NOT NULL)''') # 存储数据:序列化后插入 cur.execute("INSERT INTO exp_data_store (data) VALUES (?)", (json.dumps(exp_data),)) conn.commit() # 读取数据:反序列化直接得到原二维数组 cur.execute("SELECT data FROM exp_data_store WHERE id = 1") loaded_data = json.loads(cur.fetchone()[0]) # 输出为<class 'list'>,可直接传入matplotlib绘图 conn.close()
如果你的数组是numpy生成的,序列化前调用.tolist()方法转为原生Python列表即可。
方案2:结构化拆分存储
这种方案符合关系型数据库的设计规范,适合后续需要按IB值、x轴数值做条件查询的场景,不需要每次读取整个数组。
你的示例数组本质是带行标签(IB值)、列标签(x轴数值)的测量数据,可以拆分存储为三个字段的表:
ib_label:行标签,对应数组第一列的IB=4等内容x_value:列标签,对应数组第一行的6.0/8.0等数值y_value:对应测量值
实现示例
import sqlite3 conn = sqlite3.connect('experiment.db') cur = conn.cursor() # 建表 cur.execute('''CREATE TABLE IF NOT EXISTS ib_measurements (id INTEGER PRIMARY KEY AUTOINCREMENT, ib_label TEXT NOT NULL, x_value REAL NOT NULL, y_value REAL NOT NULL)''') # 写入数据 exp_data = [ ['', 6.0, 8.0, 10.0, 12.0, 14.0], ['IB=4', 0.143, 0.146, 0.152, 0.158, 0.167], ['IB=8', 0.415, 0.425, 0.43, 0.44, 0.45], ['IB=10', 0.545, 0.555, 0.57, 0.58, 0.59], ['IB=12', 0.766, 0.778, 0.79, 0.81, 0.83] ] x_list = exp_data[0][1:] # 提取x轴数值 for row in exp_data[1:]: ib_label = row[0] for idx, y_val in enumerate(row[1:]): cur.execute("INSERT INTO ib_measurements (ib_label, x_value, y_value) VALUES (?, ?, ?)", (ib_label, x_list[idx], y_val)) conn.commit() # 读取并还原为二维数组供matplotlib使用 cur.execute("SELECT DISTINCT x_value FROM ib_measurements ORDER BY x_value") x_list = [x[0] for x in cur.fetchall()] cur.execute("SELECT DISTINCT ib_label FROM ib_measurements") ib_list = [x[0] for x in cur.fetchall()] # 拼装原数组 loaded_data = [[''] + x_list] for ib_label in ib_list: cur.execute("SELECT y_value FROM ib_measurements WHERE ib_label = ? ORDER BY x_value", (ib_label,)) y_vals = [x[0] for x in cur.fetchall()] loaded_data.append([ib_label] + y_vals) conn.close()
方案选择建议
- 如果你只是需要把数组作为一个整体存储,后续直接取出来绘图,直接选方案1,代码量少且不会出错
- 如果你需要经常查询某个IB值下的所有数据、或者筛选x在某个范围内的测量值,选方案2
内容的提问来源于stack exchange,提问作者Majerník Tomáš
相关产品推荐
相关产品推荐

