在导入 mbxs 时,我收到一个错误,提示父消息不存在,尽管它似乎确实存在于数据库 index.db 中。
错误信息如下:
父消息 9205270657.AB03850@ben.dciem.dnd.ca 不存在。正在跳过 9206031720.AA22567@ben.dciem.dnd.ca:A CALL FOR HELP
数据库条目如下:
![]()
有什么建议可以解释为什么会失败吗?
在导入 mbxs 时,我收到一个错误,提示父消息不存在,尽管它似乎确实存在于数据库 index.db 中。
错误信息如下:
父消息 9205270657.AB03850@ben.dciem.dnd.ca 不存在。正在跳过 9206031720.AA22567@ben.dciem.dnd.ca:A CALL FOR HELP
数据库条目如下:
![]()
有什么建议可以解释为什么会失败吗?
也许排序顺序有误,因为您正在按主题对邮件进行分组?值得调查一下。邮件仅按 Subject 和 mbox 文件中的邮件顺序进行排序。
您确定真的需要按主题对邮件进行分组吗?根据您的截图来看,这些邮件似乎具有正确的 Message-ID,以及 In-Reply-To 和 References 头信息。
谢谢。查看 email_order 表,它们看起来顺序正确:
| msg_id | rowid |
|---|---|
| 9205270657.AB03850@ben.dciem.dnd.ca | 874 |
| 9206031720.AA22567@ben.dciem.dnd.ca | 875 |
是否还有其他原因导致这些父邮件未能成功导入?
在我进行首次导入时,看起来完全没有分组。我认为问题在于回复是发送给邮件列表而非原始发件人的。此外,有些邮件根本没有这些字段,因为该归档是在 28 年间由不同版本的 Eudora 手工整理而成,过程相当随意。
可能是导入父消息时失败了?有报错吗?很难判断为何找不到该消息。很抱歉,我想你需要通过修改导入脚本的 Ruby 代码来自行调试。
不,我不认为这里有错误。
好的,虽然我不熟悉 Ruby 或导入脚本,但我可以试着看看。
你能告诉我需要查看哪些脚本以及它们的位置吗?“调试”是指添加打印语句,还是有更高级的功能?
好吧,我在 map_first_post 中添加了一些打印调试信息
def map_first_post(row)
puts "Mapping parent #{row['msg_id']} #{row['subject'][0..40]}"
mapped = map_post(row)
mapped[:category] = category_id_from_imported_category_id(row['category'])
mapped[:title] = row['subject'].strip[0...255]
mapped
puts "Mapped message #{row['msg_id']} #{row['subject'][0..40]}"
end
def map_reply(row)
parent = @lookup.topic_lookup_from_imported_post_id(row['in_reply_to'])
if parent.blank?
puts "Parent message #{row['in_reply_to']} doesn't exist. Skipping #{row['msg_id']}: #{row['subject'][0..40]}"
return nil
end
mapped = map_post(row)
mapped[:topic_id] = parent[:topic_id]
mapped
end
这些打印输出正常,表明父消息已被映射(或导入?)
873 / 65936 ( 1.3%) [3895 items/min]
Mapping parent 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
Mapped message 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
874 / 65936 ( 1.3%) [3900 items/min]
Parent message 9205270657.AB03850@ben.dciem.dnd.ca doesn’t exist. Skipping 9206031720.AA22567@ben.dciem.dnd.ca: A CALL FOR HELP
因此,我不明白为什么在 map_reply 中父消息会是空的。我注意到的唯一一点是,数字(873/874)比上面的 rowid 少 1。
但我觉得我无法继续深入了,因为我不清楚 @lookup.topic_lookup_from_imported_post_id 具体在做什么,而且用 vi 编辑并重新运行导入非常耗时,每个循环大约需要 30 分钟。
它在同一目录下的 base.rb 文件中。它的功能正如函数名所暗示的那样:通过查找导入 ID(我猜这里指的是消息 ID)在主题自定义字段(或者可能是帖子自定义字段?)中,来定位对应的 topic_id。
这比那些需要花上一周的导入过程要好多了。
(有时候你可以做一些操作,让导入脚本只导入你正在调试的部分;至于如何具体实现,就留给读者自行探索了。)
你可以尝试查看数据库,看看父消息是否已被导入,以及它是否包含 import_id 主题/帖子自定义字段。
[quote=“pfaffman, post:8, topic:141746”]
它确实是在按函数名称所暗示的那样执行操作:通过查找 import_id(我猜在这种情况下应该是消息 ID)来定位 topic_id,而这个 import_id 存储在一个主题自定义字段中(或者可能是帖子自定义字段?)。[/quote]
在哪里查找?topic_id 是指主题吗?
[quote=“pfaffman, post:8, topic:141746”]
你可以尝试查看数据库,看看父消息是否已被导入,以及它是否包含一个名为 import_id 的主题/帖子自定义字段。[/quote]
你说的“数据库”是指 index.db 吗?你说的“已导入”是指已录入 index.db 的邮件表吗?是的,它确实在那里。但是没有名为 ‘import_id’ 的列。
这里的数据库指的是 Discourse 数据库。导入 ID 位于 topic_custom_field 和 post_custom_field 表中。
啊哈!
我导入了数据探索器插件,并查看了 Discourse 数据库。我发现父消息的 import_id 存在于 topic_custom_field 和 post_custom_field 表中。此外,该消息确实存在。
但它已被删除。所以我想,我之所以收到“父消息不存在”的错误,是因为导入过程是在查询 Discourse 数据库,而不是 index.db。如果能有一条提示“帖子已被删除”的错误信息,那就更好了。
无论如何,我认为这是因为在早期测试期间,我删除了第一批(较小的)导入帖子。我以为已经恢复到那个时间点之前,但显然并没有。
好在这种情况只适用于我的测试服务器,在正式服务器的导入过程中应该不会遇到这个问题。
感谢您的指点。
为什么?是谁删除的?
在导入过程中不会出现这种情况。
听起来没错。而且删除帖子并不会真正删除它们,而是将其标记为已删除。