- server: FastAPI 后端(多屏管理、素材上传、节目编排、客户端注册/配置/心跳/崩溃上报、管理台托管) - android: Java 客户端(minSdk 23,全屏图片/视频轮播、远程配置、开机自启、崩溃上报) - web: React + Vite + antd 管理台(屏幕/素材/节目管理) - 屏幕设备 ID 关联机制、gunicorn 生产部署脚本
38 lines
970 B
Python
38 lines
970 B
Python
"""数据库连接与会话管理(SQLAlchemy 2.0)。"""
|
|
from sqlalchemy import create_engine, event
|
|
from sqlalchemy.orm import DeclarativeBase, sessionmaker
|
|
|
|
from .config import get_database_url
|
|
|
|
_database_url = get_database_url()
|
|
|
|
_engine = create_engine(
|
|
_database_url,
|
|
pool_pre_ping=True,
|
|
connect_args={"check_same_thread": False} if _database_url.startswith("sqlite") else {},
|
|
echo=False,
|
|
)
|
|
|
|
|
|
@event.listens_for(_engine, "connect")
|
|
def _enable_sqlite_fk(dbapi_connection, connection_record):
|
|
"""SQLite 默认关闭外键约束,需显式开启以支持 CASCADE。"""
|
|
if _database_url.startswith("sqlite"):
|
|
cursor = dbapi_connection.cursor()
|
|
cursor.execute("PRAGMA foreign_keys=ON")
|
|
cursor.close()
|
|
|
|
SessionLocal = sessionmaker(bind=_engine, autocommit=False, autoflush=False)
|
|
|
|
|
|
class Base(DeclarativeBase):
|
|
pass
|
|
|
|
|
|
def get_db():
|
|
db = SessionLocal()
|
|
try:
|
|
yield db
|
|
finally:
|
|
db.close()
|