You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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áš

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:06:03