57 lines
1.8 KiB
Python
Raw Normal View History

2025-03-28 18:23:30 +08:00
from datetime import datetime
from sqlalchemy import create_engine, event, text
from sqlalchemy.dialects.mysql import BIGINT
2025-03-28 23:19:42 +08:00
from sqlmodel import SQLModel, Field
2025-03-28 18:23:30 +08:00
from ..config import AppConfig
2025-03-28 23:19:42 +08:00
from ..config.config import AppCtx
2025-03-28 18:23:30 +08:00
def get_timestamp():
return int(datetime.now().timestamp())
class BaseModel(SQLModel):
"""数据库基类"""
id: int = Field(default=None, primary_key=True, sa_type=BIGINT(unsigned=True))
2025-03-28 23:19:42 +08:00
created_at: int = Field(default_factory=get_timestamp, sa_type=BIGINT(unsigned=True))
updated_at: int = Field(default_factory=get_timestamp, sa_type=BIGINT(unsigned=True))
2025-03-28 18:23:30 +08:00
@event.listens_for(BaseModel, "before_update")
def update_updated_at(mapper, connection, target):
"""更新数据库记录的时候,自动更新 updated_at 字段"""
target.updated_at = get_timestamp()
def connect_db(config: AppConfig):
"""连接数据库"""
2025-03-28 23:19:42 +08:00
2025-03-28 18:23:30 +08:00
# 导入所有模型,为了自动创建数据表
2025-03-28 23:19:42 +08:00
2025-03-28 18:23:30 +08:00
dsn = f"mysql+pymysql://{config.database.user}:{config.database.password}@{config.database.host}:{config.database.port}/{config.database.database}"
2025-03-30 22:49:37 +08:00
engine = create_engine(dsn, echo=False)
2025-03-28 18:23:30 +08:00
SQLModel.metadata.create_all(engine)
2025-03-28 23:19:42 +08:00
AppCtx.g_db_engine = engine
2025-03-28 18:23:30 +08:00
return engine
2025-03-28 23:19:42 +08:00
2025-03-28 18:23:30 +08:00
def create_database(config: AppConfig):
"""如果数据库不存在,就调用这个函数初始化数据库"""
2025-03-28 23:19:42 +08:00
# 先创建一个没有指定数据库的连接
2025-03-28 18:23:30 +08:00
dsn = f"mysql+pymysql://{config.database.user}:{config.database.password}@{config.database.host}:{config.database.port}"
2025-03-30 22:49:37 +08:00
engine = create_engine(dsn, echo=False)
2025-03-28 23:19:42 +08:00
2025-03-28 18:23:30 +08:00
with engine.connect() as conn:
2025-03-28 23:19:42 +08:00
conn.execute(
text(
f"CREATE DATABASE IF NOT EXISTS {config.database.database} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
)
)
2025-03-28 18:23:30 +08:00
conn.commit()