【发布时间】:2023-03-12 15:06:01
【问题描述】:
我有一个 SQLite 表,其中包含有关某些文件的一些元数据,该表在文件的散列上有一个 UNIQUE 列。我正在编写的客户端可以在有限的范围内仅通过解析相关文件来自行填充此数据库。但是,由于数据库主要用于有关客户端可能想要下载的文件的元数据,更重要的是,由于许多这些文件的作者没有在其中包含元数据,在这种情况下,相关的数据库行必须由人工填充,它还查询几个用户定义的服务器,每个服务器都有自己的可能不完整的数据库副本。每台服务器的每一行中可能有一些空白 (NULL) 字段,其他服务器可能已填充这些字段。对于任何给定的行,数据库的每一列都有一个规范的“正确”值,因此如果同一数据库的两个不同副本使用不同的值填充同一字段,则其中一个已损坏。
我下载了远程数据库的副本,它以 CSV 文件的形式提供给我,并将其加载到我的数据库中(我已经知道了——这是 Python,所以它真的很简单
self.cursor.execute('create temporary table newinfo(a,b,c,d,e,f)')
with open('remote.csv') as f:
self.cursor.executemany('insert into newinfo values (?,?,?,?,?,?)', csv.reader(f))
它的性能可能不是很好,但如果我关心性能,我就不会使用 Python。任何更快地做到这一点的建议都将受到欢迎,但不是预期的。另外我应该提到,我实际上并没有下载到临时文件并解析它——我真的在HTTPResponse对象周围使用io.TextIOWrapper——为了简单起见,我只是把它写成打开一个本地文件为了写这个问题。)
不管怎样,在我下载了远程数据库表之后,我需要将它合并到我的本地表中。我认为本地数据库可能会填充远程数据库不会填充的字段,反之亦然。我需要做的是查看远程数据库中的字段(我刚刚下载到新的本地表中)是否不为 NULL,如果是,请将它们复制到本地表中的相同字段中。作为可选的奖励,我希望能够检测远程和本地数据库是否有任何已填充且不匹配的字段,如果是,则中止事务并向用户发出错误信号。
我的问题是:最有效的方法是什么?
【问题讨论】: