SQLite中高效检索浮点与BLOB数据并转为浮点数的方法
一次性检索SQLite混合类型数据并转换BLOB为浮点数的方案
核心思路
将两个查询合并为单次SQL查询获取所有需要的列,在Python中对返回结果逐行处理:直接提取普通浮点/字符串列,对BLOB列用numpy解析为浮点数数组,避免多次查询数据库的开销。
步骤与代码示例
1. 合并查询语句
将两个查询的字段整合到一个SQL中,注意SQLite的WHERE子句无法直接引用SELECT中的别名,因此需要重复别名对应的表达式:
SELECT ST.Name || '.' || EL.Name AS TDI, VA.Value, VA.CursorOffsetMS, EL.Scaling, VA.BlobElems, VA.BlobValues FROM tblValues AS VA LEFT JOIN tblElements AS EL ON VA.fkElements = EL.Id LEFT JOIN tblStructures AS ST ON EL.fkStructures = ST.Id WHERE ST.Name || '.' || EL.Name = ? ORDER BY VA.CursorOffsetMs
2. 完整Python处理代码
import numpy as np import sqlite3 def _connect(file): return sqlite3.connect(file) # 替换为实际的TDI变量值和数据库路径 TDI = "your_target_tdi" db_file = "your_database.db" cn = _connect(db_file) cur = cn.cursor() # 执行单次查询 query = """ SELECT ST.Name || '.' || EL.Name AS TDI, VA.Value, VA.CursorOffsetMS, EL.Scaling, VA.BlobElems, VA.BlobValues FROM tblValues AS VA LEFT JOIN tblElements AS EL ON VA.fkElements = EL.Id LEFT JOIN tblStructures AS ST ON EL.fkStructures = ST.Id WHERE ST.Name || '.' || EL.Name = ? ORDER BY VA.CursorOffsetMs """ cur.execute(query, (TDI,)) results = cur.fetchall() # 处理结果并转换BLOB为浮点数 float_data_list = [] # 根据BLOB实际存储的浮点数类型调整dtype,比如np.float32或np.float64 blob_dtype = np.float32 # 如果是大端字节序,使用np.dtype('>f4')替代上面的np.float32 for row in results: # 提取普通字段并转换为浮点数 value = np.float64(row[1]) if row[1] is not None else None cursor_offset = row[2] scaling = np.float64(row[3]) if row[3] is not None else None blob_elems = row[4] # 转换BLOB字段为浮点数数组 blob_values = row[5] if blob_values is not None and blob_values: blob_float_array = np.frombuffer(blob_values, dtype=blob_dtype) else: blob_float_array = np.array([]) # 按需整合字段到列表 float_data_list.append((value, cursor_offset, scaling, blob_elems, blob_float_array)) # 转换为numpy数组(根据需求选择是否需要) float_data = np.array(float_data_list, dtype=object) cn.close()
关键注意事项
- BLOB类型匹配:
np.frombuffer的dtype必须和BLOB中存储的浮点数类型完全一致(比如是32位还是64位浮点数),字节序(小端/大端)也要匹配,否则转换结果会出错。 - NULL值处理:由于使用
LEFT JOIN,部分字段可能返回None,转换时需要先判断避免报错。 - 性能优化:单次查询减少了数据库IO开销,比两次查询更高效;批量处理结果时可根据数据量调整是否分批处理。
内容的提问来源于stack exchange,提问作者gis20
相关产品推荐
相关产品推荐

