我有时会从一个非常古老的数据库(MS Access)中提取大量数据。序列化输出存储为YAML文件,其他脚本在本地使用这些文件以加快进程。
有时我们通过从数据库中提取(可能的)新数据来更新本地文件。这种提取很长,如果有关表的内容与最后一次提取相同,我想避免使用它。
是否有可能获得表格状态或表格的一部分的签名?
换句话说,这有助于理解我的问题:
signature = db.GetSignature('SELECT * FROM foo where bar = 1')
if local_foo.signature != signature:
local_foo = db.Extract('SELECT * FROM foo where bar = 1')
我可以使用哪些解决方案?
答案 0 :(得分:1)
如果您可以轻松控制原始Access数据库的插入/更新/删除功能,那么最佳/最安全的解决方案是实现数据库触发器以启用跟踪。这样,您可以轻松地至少存储“上次修改”值或保留一个表格,该表格负责存储大量跟踪信息。
不幸的是,Access不支持触发器(除非您使用2010+,请参阅下面的),但您可以在数据库中使用VBA实现触发器。
Access 2010介绍data macros,但我不认为这是一个选项!
如果你不能使用数据库触发器,也许你可以使用这样的工作流程:
json.dumps()
)hashlib.sha1()
& hashObject.hexdigest()
)为了保持数据库端(避免传输数据),尝试在Access数据库中使用VBA生成哈希可能很有用。
您可以使用此SO帖子中提到的散列算法代码:https://stackoverflow.com/a/14749855
示例:强>
使用此SHA1代码:https://gist.github.com/anonymous/573a875dac68a4af560d
Dim d As DAO.Database
Dim r As DAO.Recordset
Dim s As String
Set d = CurrentDb()
Set r = d.OpenRecordset("SELECT foo, bar, baz FROM foobar")
s = ""
While Not r.EOF
s = s & r!foo & "," & r!bar & "," & r!baz & ";"
r.MoveNext
Wend
r.Close
Set r = Nothing
Set d = Nothing
s = SHA1TRUNC(s)