guanghulab/brain/persona-brain-db/import_notion.py
铸渊 ICE-GL-ZY001 02a12c2d58
Some checks failed
自动更新代码和重启 / update-and-restart (push) Has been cancelled
CI检查 + 自动部署 / check (push) Has been cancelled
CI检查 + 自动部署 / deploy (push) Has been cancelled
D123+ persona-brain-db 本地化: 25个SQL Schema + import_notion.py
- 21张表完整Schema + init.sql + 3个种子数据文件
- import_notion.py: Notion Markdown导出→documents表导入器
- brain.db本地已建(1.5MB): 137页+完整树形结构(最深11层)
- 种子数据: 13公理·34核心原则·49条原则·12人格体
- 待追加: 第五域剩余分区导出
2026-06-04 16:22:10 +08:00

88 lines
2.9 KiB
Python

#!/usr/bin/env python3
"""Notion Markdown Export → SQLite brain.db importer"""
import sqlite3, os, re, json, uuid
DB = "/Users/bingshuolingdianyuanhe/WorkBuddy/2026-06-04-13-44-41/persona-brain-db/brain.db"
CONTENT = "/tmp/fifth-domain-extract/content/私人与共享"
def parse_md(filepath):
"""Parse a Notion-exported .md file"""
fn = os.path.basename(filepath).replace('.md', '')
uuid = None
title = fn
m = re.search(r'([a-f0-9]{32})$', fn)
if m:
uuid = m.group(1)
title = fn[:fn.rindex(uuid)].strip().rstrip(' ·').strip()
with open(filepath, 'r', encoding='utf-8') as f:
raw = f.read()[:8000]
return {"title": title, "uuid": uuid, "content": raw, "path": filepath}
def main():
conn = sqlite3.connect(DB)
c = conn.cursor()
# Clear existing imported data
c.execute("DELETE FROM documents")
c.execute("DELETE FROM persona_memory")
conn.commit()
pages = []
dir_to_uuid = {} # directory path -> uuid of the Notion page it represents
# First pass: build dir_to_uuid map
for walk_root, dirs, files in os.walk(CONTENT):
for f in files:
if not f.endswith('.md'): continue
fpath = os.path.join(walk_root, f)
page = parse_md(fpath)
if page['uuid']:
# This file IS the Notion page for walk_root dir
dir_to_uuid[walk_root] = page['uuid']
# Second pass: build pages with parent relationships
for walk_root, dirs, files in os.walk(CONTENT):
for f in sorted(files):
if not f.endswith('.md'): continue
fpath = os.path.join(walk_root, f)
page = parse_md(fpath)
if not page['uuid']: continue
rel = os.path.relpath(fpath, CONTENT)
depth = max(0, rel.count('/'))
# Find parent: the directory that contains this file
# is the parent dir; its Notion page UUID is in dir_to_uuid
parent_id = dir_to_uuid.get(walk_root) if depth > 0 else None
pages.append({
"depth": depth,
"parent_id": parent_id,
"path": rel,
**page
})
for p in pages:
c.execute("""
INSERT OR REPLACE INTO documents (document_id, title, content, parent_id, path, content_type)
VALUES (?, ?, ?, ?, ?, 'notion')
""", (p['uuid'], p['title'], p['content'][:8000], p['parent_id'], p['path']))
conn.commit()
c.execute("SELECT count(*) FROM documents")
total = c.fetchone()[0]
c.execute("SELECT count(*) FROM documents WHERE parent_id IS NULL")
roots = c.fetchone()[0]
print(f"Imported {total} pages ({roots} root pages)")
c.execute("SELECT document_id, title FROM documents WHERE parent_id IS NULL")
for row in c.fetchall():
print(f" [{row[0][:8]}..] {row[1][:70]}")
conn.close()
print("Done.")
if __name__ == '__main__':
main()