用Python重构《出师表》
在My SQL版本的出师表 - 礼印外盒基础上,将使用SQLAlchemy作为ORM工具,并结合Python代码来实现重构出师表(请勿将以下代码用于生产环境):
from sqlalchemy import (
create_engine, Column, Integer, String, Text, Enum, DateTime,
ForeignKey, CheckConstraint, Float, Boolean, JSON, func, event
)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, Session
from sqlalchemy.sql import text
from datetime import datetime
import json
import math
# 数据库连接配置
DATABASE_URI = "sqlite:///shu_han.db"
engine = create_engine(DATABASE_URI, echo=True)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
# 三维空间点类
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"POINT({self.x} {self.y})"
@classmethod
def from_str(cls, point_str):
# 解析"POINT(x y)"格式的字符串
if point_str.startswith("POINT(") and point_str.endswith(")"):
coords = point_str[6:-1].split()
return cls(float(coords[0]), float(coords[1]))
return None
def to_wkt(self):
return f"POINT({self.x} {self.y})"
# 先帝遗志表
class EmperorLegacy(Base):
__tablename__ = "先帝遗志"
遗训编号 = Column(Integer, primary_key=True, autoincrement=True)
遗训内容 = Column(Text, nullable=False)
生效时间 = Column(DateTime, default=datetime(223, 4, 1))
完成状态 = Column(Enum("待实施", "进行中", "已完成"), nullable=False)
执行版本 = Column(String(20))
__table_args__ = (
CheckConstraint("CHAR_LENGTH(遗训内容) > 10"),
CheckConstraint("(遗训内容 LIKE '%汉室%' OR 遗训内容 LIKE '%中原%') AND 遗训内容 NOT LIKE '%投降%'"),
)
# 文武群臣表
class Minister(Base):
__tablename__ = "文武群臣"
臣工编号 = Column(Integer, primary_key=True, autoincrement=True)
姓名 = Column(String(20), nullable=False)
职级 = Column(Enum("侍中", "尚书", "长史", "参军", "督尉"), nullable=False)
可靠性 = Column(Integer, CheckConstraint("可靠性 BETWEEN 0 AND 100"))
最后考核 = Column(DateTime, default=datetime.now)
特长 = Column(String(100)) # 用逗号分隔的特长列表
__table_args__ = (
Index("贤臣筛选", "可靠性", "特长"),
)
# 军事部署表
class MilitaryDeployment(Base):
__tablename__ = "军事部署"
战区编号 = Column(Integer, primary_key=True, autoincrement=True)
方位 = Column(String(50), nullable=False) # WKT格式存储点
兵力 = Column(Integer, CheckConstraint("兵力 >= 10000"))
军械 = Column(JSON)
指挥官 = Column(Integer, ForeignKey("文武群臣.臣工编号"))
指挥官关系 = relationship("Minister", backref="指挥的战区")
# 紧急军情表
class EmergencyReport(Base):
__tablename__ = "紧急军情"
战区编号 = Column(Integer, primary_key=True)
剩余兵力 = Column(Integer)
请求支援 = Column(Boolean, default=True)
# 治国日志表
class GovernanceLog(Base):
__tablename__ = "治国日志"
时间 = Column(DateTime, primary_key=True, default=datetime.now)
操作 = Column(Text, nullable=False)
# 创建表结构
Base.metadata.create_all(engine)
# 治国存储过程
def 亲贤臣远小人(db: Session, 陛下版本: str):
try:
# 人才选拔
当前时间 = datetime.now()
可用贤臣 = db.query(Minister).filter(
Minister.可靠性 > 80,
Minister.最后考核 >= 当前时间.replace(year=当前时间.year-1)
).all()
if len(可用贤臣) < 5:
raise Exception("此诚危急存亡之秋也")
# 战略规划 - 增加长安附近战区兵力
长安坐标 = Point(34.26, 108.94)
db.execute(text("""
UPDATE 军事部署
SET 兵力 = 兵力 * 1.2
WHERE 战区编号 IN (
SELECT 战区编号
FROM 军事部署
WHERE ST_Distance_Sphere(POINT(:长安x, :长安y), 方位) < 100000
)
"""), {"长安x": 长安坐标.x, "长安y": 长安坐标.y})
# 日志记录
db.add(GovernanceLog(
操作=f"执行版本: {陛下版本}"
))
db.commit()
except Exception as e:
db.rollback()
raise e
# 军事触发器逻辑
@event.listens_for(MilitaryDeployment, 'after_update')
def 战局响应(mapper, connection, target):
新兵力 = target.兵力
旧兵力 = connection.scalar(text("SELECT 兵力 FROM 军事部署 WHERE 战区编号 = :id"), id=target.战区编号)
if 新兵力 < 旧兵力 * 0.3:
connection.execute(text("""
INSERT INTO 紧急军情 (战区编号, 剩余兵力, 请求支援)
VALUES (:战区编号, :剩余兵力, 1)
"""), {"战区编号": target.战区编号, "剩余兵力": 新兵力})
connection.execute(text("""
UPDATE 文武群臣
SET 可靠性 = 可靠性 - 10
WHERE 臣工编号 = :指挥官
"""), {"指挥官": target.指挥官})
# 定时战略检查(五年之约)
def 北伐进度监控(db: Session):
完成状态 = db.query(EmperorLegacy.完成状态).filter_by(遗训编号=1).scalar()
if 完成状态 != "已完成":
print("北定中原逾期警告")
# 全文索引查询
def 泣血陈词(db: Session, 关键词: str):
# SQLite不支持全文索引,这里用LIKE代替
结果 = db.query(EmperorLegacy).filter(
EmperorLegacy.遗训内容.like(f"%{关键词}%")
).all()
return 结果
# 最终战略视图
def 兴汉路线图(db: Session):
结果 = db.execute(text("""
SELECT
m.战区编号,
m.方位 AS 战略坐标,
j.姓名 AS 总指挥,
(SELECT COUNT(*) FROM 文武群臣 s WHERE s.可靠性 > 75) AS 可用人才,
(SELECT SUM(兵力) FROM 军事部署) AS 总兵力
FROM 军事部署 m
JOIN 文武群臣 j ON m.指挥官 = j.臣工编号
GROUP BY m.战区编号
""")).fetchall()
return 结果
# 初始化数据
def 初始化数据(db: Session):
# 插入先帝遗志
db.add_all([
EmperorLegacy(
遗训内容="攘除奸凶,兴复汉室,还于旧都",
完成状态="待实施",
执行版本="出师表v2.0"
),
EmperorLegacy(
遗训内容="咨诹善道,察纳雅言",
完成状态="进行中",
执行版本="隆中对v1.0"
)
])
# 插入文武群臣
db.add_all([
Minister(姓名="郭攸之", 职级="侍中", 可靠性=95, 特长="粮草,谍报"),
Minister(姓名="费祎", 职级="尚书", 可靠性=92, 特长="阵法,攻城"),
Minister(姓名="赵云", 职级="督尉", 可靠性=99, 特长="守御,攻城"),
Minister(姓名="向宠", 职级="参军", 可靠性=89, 特长="阵法,谍报")
])
# 插入军事部署
db.add_all([
MilitaryDeployment(
方位=Point(34.26, 108.94).to_wkt(), # 长安
兵力=50000,
军械=json.dumps({"弓箭": 5000, "云梯": 20, "粮草_石": 80000}),
指挥官=3 # 赵云
),
MilitaryDeployment(
方位=Point(31.08, 103.42).to_wkt(), # 成都
兵力=30000,
军械=json.dumps({"弓箭": 3000, "云梯": 10, "粮草_石": 60000}),
指挥官=1 # 郭攸之
)
])
db.commit()
# 主程序
if __name__ == "__main__":
db = SessionLocal()
try:
# 初始化数据库
初始化数据(db)
# 执行治国策略
亲贤臣远小人(db, "出师表v2.0")
# 模拟战区兵力减少
战区 = db.query(MilitaryDeployment).first()
战区.兵力 = 战区.兵力 * 0.25 # 减少到25%
db.commit()
# 查询紧急军情
军情 = db.query(EmergencyReport).all()
print("紧急军情:", 军情)
# 查询兴汉路线图
路线图 = 兴汉路线图(db)
print("兴汉路线图:", 路线图)
# 查询泣血陈词
陈词 = 泣血陈词(db, "汉室")
print("泣血陈词:", 陈词)
except Exception as e:
db.rollback()
print("错误:", e)
finally:
db.close()
这个Python版本的《出师表》数据库系统实现了以下功能:
三维时空建模:通过
Point
类实现空间坐标存储军政事务工作流:通过事务管理和存储过程实现
战略资源调度系统:通过触发器和事件监控实现
人才管理系统:通过可靠性评分和特长标签实现
战略规划:通过SQLAlchemy ORM和原生SQL混合实现
全文索引:虽然SQLite不支持全文索引,但提供了替代实现
这个实现保留了原SQL版本的核心思想,同时利用Python的面向对象特性进行了重构。
#Python(1)#My SQL(3)#重构(4)#出师表(4)评论