FA3-Datafetch/legacy/create_new_database.py
2026-01-11 21:33:47 +08:00

132 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
创建新数据库并初始化所有表
数据库名: fa3_new
"""
import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
import os
from dotenv import load_dotenv
load_dotenv()
def create_database():
"""创建新数据库"""
# 连接到 postgres 数据库(默认数据库)
conn = psycopg2.connect(
host=os.getenv("DB_HOST", "192.168.3.195"),
user=os.getenv("DB_USER", "value"),
password=os.getenv("DB_PASSWORD", "Value609!"),
dbname="postgres", # 连接到默认数据库
port=os.getenv("DB_PORT", "5432")
)
conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cursor = conn.cursor()
try:
# 检查数据库是否存在
cursor.execute("SELECT 1 FROM pg_database WHERE datname='fa3_new'")
exists = cursor.fetchone()
if exists:
print("⚠️ 数据库 fa3_new 已存在")
response = input("是否删除并重建?(yes/no): ")
if response.lower() == 'yes':
# 断开所有连接
cursor.execute("""
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'fa3_new'
AND pid <> pg_backend_pid()
""")
cursor.execute("DROP DATABASE fa3_new")
print("✅ 已删除旧数据库")
else:
print("❌ 取消操作")
return False
# 创建新数据库(使用 template0 以支持 UTF-8
cursor.execute("""
CREATE DATABASE fa3_new
WITH OWNER = value
ENCODING = 'UTF8'
TEMPLATE = template0
""")
print("✅ 成功创建数据库: fa3_new")
return True
except Exception as e:
print(f"❌ 创建数据库失败: {e}")
return False
finally:
cursor.close()
conn.close()
def initialize_database():
"""初始化数据库表结构"""
conn = psycopg2.connect(
host=os.getenv("DB_HOST", "192.168.3.195"),
user=os.getenv("DB_USER", "value"),
password=os.getenv("DB_PASSWORD", "Value609!"),
dbname="fa3_new", # 连接到新数据库
port=os.getenv("DB_PORT", "5432")
)
conn.set_client_encoding('UTF8')
conn.autocommit = True
cursor = conn.cursor()
try:
# 读取初始化脚本
with open('migrations/init_new_database.sql', 'r', encoding='utf-8') as f:
sql = f.read()
# 执行SQL
cursor.execute(sql)
print("✅ 数据库表结构初始化完成")
# 显示创建的表
cursor.execute("""
SELECT schemaname, tablename
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename
""")
tables = cursor.fetchall()
print(f"\n📊 已创建 {len(tables)} 个表:")
for schema, table in tables:
print(f" - {table}")
return True
except Exception as e:
print(f"❌ 初始化数据库失败: {e}")
return False
finally:
cursor.close()
conn.close()
def main():
print("="*60)
print("FA3 新数据库创建工具")
print("="*60)
# 1. 创建数据库
if not create_database():
return
# 2. 初始化表结构
print("\n开始初始化表结构...")
if not initialize_database():
return
print("\n" + "="*60)
print("✅ 新数据库创建完成!")
print("="*60)
print("\n下一步:")
print("1. 更新 .env 文件中的 DB_NAME=fa3_new")
print("2. 或使用环境变量: export DB_NAME=fa3_new")
print("3. 重启后端服务即可使用新数据库")
if __name__ == "__main__":
main()