LiteDB跨语言兼容性问题:.Net生成库Python读取提示表不存在
问题背景
- .Net应用将如下定义的
GSR_raw类数据存入LiteDB:
public class GSR_raw { public string SystemStamp { get; set; } public float unknow { get; set; } public float s { get; set; } public float UnixTimeStamp { get; set; } public float InternalSignal { get; set; } public float Conductance { get; set; } public float uS { get; set; } }
- 使用Python读取上述逻辑生成的.db文件失败,Python端定义的
GSR_raw类如下:
class GSR_raw: def __init__(self, SystemStamp: str, unknow: float, s: float,UnixTimeStamp: float, InternalSignal: float, Conductance: float, uS: float): self.SystemStamp = SystemStamp self.unknow = unknow self.s = s self.UnixTimeStamp = UnixTimeStamp self.InternalSignal = InternalSignal self.Conductance = Conductance self.uS = uS def __repr__(self) -> str: return str(self.__dict__)
- 读取数据使用的代码如下:
def get_raw_data(path): disk_db = DiskDatabase(path) temp_data = list(disk_db.select(GSR_raw))
- 抛出错误信息:
No table of <class 'classes.GSR_raw'> exists in this database
- 已确认传入的数据库文件路径配置正确,疑问为该问题是否由不同语言版本LiteDB的兼容性问题导致。
问题原因
该报错不是跨语言兼容性直接导致的,核心原因是两端LiteDB的默认集合命名规则不匹配:
- .Net版官方LiteDB存储实体时,默认集合名为类名的复数形式(如
GSR_raw默认存入GSR_raws集合),不会携带类的命名空间前缀。 - 你使用的Python版LiteDB封装
DiskDatabase,默认会以类的全限定名(即报错中显示的classes.GSR_raw)作为匹配集合的依据,和.Net端实际生成的集合名完全不一致,因此触发“表不存在”的报错。 - 额外需要注意:LiteDB v4和v5的文件格式完全不兼容,如果两端使用的LiteDB大版本不一致,即便解决了集合名匹配问题,也会出现读取失败的情况,但你当前的报错和版本兼容性无关。
解决方法
- 第一步:先确认实际集合名。可以用LiteDB可视化工具打开目标db文件,查看存储GSR_raw数据的真实集合名称。
- 第二步:读取时不要依赖Python端的自动类-集合映射,手动指定集合名读取,或者给Python端的
GSR_raw类添加集合名映射配置,让其匹配db中实际存在的集合名。 - 第三步:校验两端LiteDB的大版本号,确保版本一致,避免后续出现格式解析错误。
内容的提问来源于stack exchange,提问作者raulmd13
相关产品推荐
相关产品推荐

