98 lines
2.5 KiB
Python
98 lines
2.5 KiB
Python
"""
|
||
子图数据库表初始化
|
||
在 FastAPI 启动时创建表
|
||
"""
|
||
from typing import Optional
|
||
|
||
|
||
async def init_subgraph_tables(conn):
|
||
"""
|
||
初始化子图所需的表
|
||
|
||
Args:
|
||
conn: 数据库连接(来自 AsyncPostgresSaver)
|
||
"""
|
||
|
||
# 1. contacts 表(通讯录)
|
||
await _create_contacts_table(conn)
|
||
|
||
# 2. words 表(词典)
|
||
await _create_words_table(conn)
|
||
|
||
# 3. news 表(资讯)
|
||
await _create_news_table(conn)
|
||
|
||
|
||
async def _create_contacts_table(conn):
|
||
"""创建 contacts 表"""
|
||
sql = """
|
||
CREATE TABLE IF NOT EXISTS contacts (
|
||
id VARCHAR(64) PRIMARY KEY,
|
||
user_id VARCHAR(64) NOT NULL,
|
||
name VARCHAR(100) NOT NULL,
|
||
phone VARCHAR(32),
|
||
email VARCHAR(100),
|
||
company VARCHAR(100),
|
||
position VARCHAR(100),
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
||
INDEX idx_contacts_user (user_id)
|
||
);
|
||
"""
|
||
|
||
try:
|
||
async with conn.cursor() as cur:
|
||
await cur.execute(sql)
|
||
# 注释掉 INFO 打印,避免噪声
|
||
except Exception as e:
|
||
print(f"contacts 表可能已存在: {e}")
|
||
|
||
|
||
async def _create_words_table(conn):
|
||
"""创建 words 表"""
|
||
sql = """
|
||
CREATE TABLE IF NOT EXISTS words (
|
||
id VARCHAR(64) PRIMARY KEY,
|
||
user_id VARCHAR(64) NOT NULL,
|
||
word VARCHAR(100) NOT NULL,
|
||
phonetic VARCHAR(100),
|
||
part_of_speech VARCHAR(50),
|
||
definition TEXT,
|
||
examples TEXT,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
||
INDEX idx_words_user (user_id),
|
||
INDEX idx_words_word (word)
|
||
);
|
||
"""
|
||
|
||
try:
|
||
async with conn.cursor() as cur:
|
||
await cur.execute(sql)
|
||
except Exception as e:
|
||
print(f"words 表可能已存在: {e}")
|
||
|
||
|
||
async def _create_news_table(conn):
|
||
"""创建 news 表"""
|
||
sql = """
|
||
CREATE TABLE IF NOT EXISTS news (
|
||
id VARCHAR(64) PRIMARY KEY,
|
||
user_id VARCHAR(64) NOT NULL,
|
||
title VARCHAR(200) NOT NULL,
|
||
content TEXT,
|
||
url VARCHAR(500),
|
||
source VARCHAR(100),
|
||
keywords TEXT,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
||
INDEX idx_news_user (user_id)
|
||
);
|
||
"""
|
||
|
||
try:
|
||
async with conn.cursor() as cur:
|
||
await cur.execute(sql)
|
||
except Exception as e:
|
||
print(f"news 表可能已存在: {e}")
|