export_db_to_jsonl.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. """
  2. 将 SQLite 数据库文件导出为 JSONL 格式
  3. 使用方法:
  4. python export_db_to_jsonl.py <db_file_path> [output_file_path]
  5. 示例:
  6. python export_db_to_jsonl.py tmp/user1/sqlite/doc-abc123.db
  7. python export_db_to_jsonl.py tmp/user1/sqlite/doc-abc123.db output.jsonl
  8. python export_db_to_jsonl.py D:\code\ax-backend-v1\tmp\default-user\sqlite\doc-a11d6a3cd242.db output.jsonl
  9. """
  10. import json
  11. import sqlite3
  12. import sys
  13. from pathlib import Path
  14. def export_db_to_jsonl(db_path: str, output_path: str = None):
  15. """
  16. 将 SQLite 数据库导出为 JSONL 格式
  17. Args:
  18. db_path: SQLite 数据库文件路径
  19. output_path: 输出的 JSONL 文件路径(可选,默认为 db_path.jsonl)
  20. """
  21. db_file = Path(db_path)
  22. # 检查数据库文件是否存在
  23. if not db_file.exists():
  24. print(f"错误: 数据库文件不存在: {db_path}")
  25. return False
  26. # 确定输出文件路径
  27. if output_path is None:
  28. output_path = db_file.with_suffix('.jsonl')
  29. else:
  30. output_path = Path(output_path)
  31. try:
  32. # 连接数据库
  33. conn = sqlite3.connect(str(db_file))
  34. conn.row_factory = sqlite3.Row
  35. cursor = conn.cursor()
  36. # 查询所有 blocks,按 block_order 排序
  37. cursor.execute("""
  38. SELECT * FROM document_blocks
  39. ORDER BY block_order
  40. """)
  41. rows = cursor.fetchall()
  42. if not rows:
  43. print(f"警告: 数据库中没有找到任何 blocks")
  44. return False
  45. # 写入 JSONL 文件
  46. with open(output_path, 'w', encoding='utf-8') as f:
  47. for row in rows:
  48. # 转换为字典
  49. block = dict(row)
  50. # 解析 JSON 字段
  51. if block.get('style'):
  52. try:
  53. block['style'] = json.loads(block['style'])
  54. except (json.JSONDecodeError, TypeError):
  55. block['style'] = {}
  56. if block.get('metadata'):
  57. try:
  58. block['metadata'] = json.loads(block['metadata'])
  59. except (json.JSONDecodeError, TypeError):
  60. block['metadata'] = {}
  61. # content 可能是 JSON(富文本或表格)
  62. if block.get('content'):
  63. try:
  64. block['content'] = json.loads(block['content'])
  65. except (json.JSONDecodeError, TypeError):
  66. pass # 保持原字符串
  67. # 写入一行 JSON
  68. f.write(json.dumps(block, ensure_ascii=False) + '\n')
  69. conn.close()
  70. print(f"✓ 成功导出 {len(rows)} 个 blocks")
  71. print(f"✓ 输出文件: {output_path}")
  72. return True
  73. except sqlite3.Error as e:
  74. print(f"错误: 数据库操作失败: {e}")
  75. return False
  76. except Exception as e:
  77. print(f"错误: {e}")
  78. return False
  79. def main():
  80. """主函数"""
  81. if len(sys.argv) < 2:
  82. print("用法: python export_db_to_jsonl.py <db_file_path> [output_file_path]")
  83. print("\n示例:")
  84. print(" python export_db_to_jsonl.py tmp/user1/sqlite/doc-abc123.db")
  85. print(" python export_db_to_jsonl.py tmp/user1/sqlite/doc-abc123.db output.jsonl")
  86. sys.exit(1)
  87. db_path = sys.argv[1]
  88. output_path = sys.argv[2] if len(sys.argv) > 2 else None
  89. print(f"正在导出数据库: {db_path}")
  90. success = export_db_to_jsonl(db_path, output_path)
  91. if success:
  92. print("\n导出完成!")
  93. sys.exit(0)
  94. else:
  95. print("\n导出失败!")
  96. sys.exit(1)
  97. if __name__ == "__main__":
  98. main()