数据分析agent(十三_2):业务层和持久层相互转换mapper
二,属性 解释role:Mapped[str]mapped_column( String(32), comment列类别 (primary_key,forergn_key,measure,dimension) ) role: Mapped[str]Python 类型注解 Mapped 是 SQLAlchemy 提供的一个泛型类型用于在声明式模型中标注该属性在 Python 中的数据类型。 Mapped[str] 表示这个字段在 Python 层面是一个字符串类型。SQLAlchemy 会根据这个类型提示自动推断出对应的数据库数据类型如果不显式指定的话以及该列是否允许为 NULL。 mapped_column(...)数据库列配置 这个函数用于描述该列在数据库中的具体约束和规格。 String(32)显式指定了数据库中的数据类型为 VARCHAR且最大长度限制为 32 个字符。如果这里不传参数SQLAlchemy 会默认使用 Mapped[str] 推导出的类型但显式指定长度是更严谨的做法。 comment列类别...为该数据库字段添加注释说明。这在生成数据库 DDL如 CREATE TABLE 语句时会作为列注释写入数据库有助于后续维护时理解该字段的业务含义。 primary_key (主键) 代表该列是表的主键用于唯一标识表中的每一行记录。 forergn_key (外键) 注这里存在一个拼写错误正确的英文应该是 foreign_key。 代表该列是外键用于关联其他表建立表与表之间的关系。 measure (度量) 在数据仓库中度量通常指可被聚合计算的数值型数据。例如销售额、利润、订单数量、温度等。它们通常用于图表中的 Y 轴或指标卡片。 dimension (维度) 维度是指用于观察和分析数据的上下文或分类属性。例如时间年/月/日、地区、产品类别、客户名称等。它们通常用于图表中的 X 轴、分组Group By或筛选器。三各层的数据例子 column 列 来举例1业务层和应用层web,小程序 等交互的column_info.py:# 列对象 的类业务层用来表示 各个列 的对象 的封装 # 8给 个属性 from dataclasses import dataclass from typing import Any dataclass class ColumnInfo: id:str name:str type:str # 列 数据类型 role:str # 列类别 ( # primary_key 主键,forergn_key 外键 ,measure 度量:数值,dimension 维度:维度表中的属性 examples:list[Any] # 数据示例 description:str alias:list[str] table_id:str2,持久层和数据库交互的 column_info_mysql.pyfrom sqlalchemy.orm import Mapped, mapped_column from day05_Info_model.models.base import Base from sqlalchemy import String,Text from sqlalchemy.types import JSON class ColumnInfoMySQL(Base): __tablename__ coloumn_info id:Mapped[str]mapped_column( String(64), primary_keyTrue, comment列的编号 ) name:Mapped[str |None]mapped_column( String(128), comment列名称 ) type:Mapped[str | None]mapped_column( String(64), comment列 数据类型 ) role:Mapped[str | None]mapped_column( String(32), comment列类别 (primary_key 主键,forergn_key 外键 ,measure 度量:数值,dimension 维度:维度表中的属性 ) ) examples:Mapped[dict| list | None]mapped_column( JSON, comment列对象的 举例说明,数据示例 ) description:Mapped[str |None]mapped_column( Text, comment列 的 描述 说明是做什么的 ) alias:Mapped[dict | list | None]mapped_column( JSON, comment列别名 ) table_id:Mapped[str | None]mapped_column( String(64), comment列 所在的 对应的表 的编号 id )3,业务层和持久层的相互转换column_info_mapper.py:from dataclasses import asdict from day05_Info_model.entities.column_info import ColumnInfo from day05_Info_model.models.coloumn_info_mysql import ColumnInfoMySQL class ColumnInfoMapper: staticmethod def to_entity(column_info_mysql:ColumnInfoMySQL)-ColumnInfo: return ColumnInfo( idcolumn_info_mysql.id, namecolumn_info_mysql.name, typecolumn_info_mysql.type, rolecolumn_info_mysql.role, examplescolumn_info_mysql.examples, descriptioncolumn_info_mysql.description, aliascolumn_info_mysql.alias, table_idcolumn_info_mysql.table_id ) staticmethod def to_model(column_info:ColumnInfo)-ColumnInfoMySQL: return ColumnInfoMySQL(**asdict(column_info))四mapper:业务层和持久层转换 验证测试11_column_mapper_test.py:# main_test.py from dataclasses import asdict from day05_Info_model.entities.column_info import ColumnInfo from day05_Info_model.models.coloumn_info_mysql import ColumnInfoMySQL from day05_Info_model.mappers.column_info_mapper import ColumnInfoMapper # 1. 构造业务层对象 (Entity) entity ColumnInfo( idcol_001, namesales_amount, typeDECIMAL(10,2), rolemeasure, examples[199.99, 250.00], description销售总金额, alias[销售额, 营收], table_idtbl_order ) print( 1. 原始业务实体 (Entity) ) print(entity) # 触发 dataclass 的 __repr__ print() # 2. Entity - Model (业务层转持久层) model ColumnInfoMapper.to_model(entity) print( 2. 转换后的数据库模型 (Model) ) print(model) # 触发 SQLAlchemy 声明式对象的 __repr__ print() # 3. Model - Entity (持久层转回业务层) new_entity ColumnInfoMapper.to_entity(model) print( 3. 转换回业务实体 (Entity) ) print(new_entity) 1. 原始业务实体 (Entity) ColumnInfo(idcol_001, namesales_amount, typeDECIMAL(10,2), rolemeasure, examples[199.99, 250.0], description销售总金额, alias[销售额, 营收], table_idtbl_order) 2. 转换后的数据库模型 (Model) day05_Info_model.models.coloumn_info_mysql.ColumnInfoMySQL object at 0x00000210DB15AD50 3. 转换回业务实体 (Entity) ColumnInfo(idcol_001, namesales_amount, typeDECIMAL(10,2), rolemeasure, examples[199.99, 250.0], description销售总金额, alias[销售额, 营收], table_idtbl_order) 2,2_test_column_info_mapper.py:# test_column_info_mapper.py import unittest from day05_Info_model.entities.column_info import ColumnInfo from day05_Info_model.models.coloumn_info_mysql import ColumnInfoMySQL from day05_Info_model.mappers.column_info_mapper import ColumnInfoMapper class TestColumnInfoMapper(unittest.TestCase): def setUp(self): 测试前的准备工作构造一个标准的业务实体 self.entity ColumnInfo( idcol_001, namesales_amount, typeDECIMAL(10,2), rolemeasure, examples[199.99, 250.00], description销售总金额, alias[销售额, 营收], table_idtbl_order ) def test_to_model(self): 测试业务实体 - 数据库模型 model ColumnInfoMapper.to_model(self.entity) # 验证类型转换是否正确 self.assertIsInstance(model, ColumnInfoMySQL) # 验证字段值是否完全一致 self.assertEqual(model.id, col_001) self.assertEqual(model.name, sales_amount) self.assertEqual(model.type, DECIMAL(10,2)) self.assertEqual(model.role, measure) self.assertEqual(model.examples, [199.99, 250.00]) self.assertEqual(model.description, 销售总金额) self.assertEqual(model.alias, [销售额, 营收]) self.assertEqual(model.table_id, tbl_order) def test_to_entity(self): 测试数据库模型 - 业务实体 # 模拟从数据库查出来的对象这里用字典模拟 SQLAlchemy 对象的行为 class MockDBModel: def __init__(self): self.id col_002 self.name user_name self.type VARCHAR(64) self.role dimension self.examples [Alice, Bob] self.description 用户姓名 self.alias [姓名] self.table_id tbl_user mock_model MockDBModel() entity ColumnInfoMapper.to_entity(mock_model) # 验证类型转换是否正确 self.assertIsInstance(entity, ColumnInfo) # 验证字段值 self.assertEqual(entity.id, col_002) self.assertEqual(entity.role, dimension) self.assertEqual(entity.alias, [姓名]) def test_round_trip_conversion(self): 测试双向转换Entity - Model - Entity确保数据不丢失 model ColumnInfoMapper.to_model(self.entity) converted_entity ColumnInfoMapper.to_entity(model) # 验证经过一轮转换后数据是否和原始实体一致 self.assertEqual(self.entity.id, converted_entity.id) self.assertEqual(self.entity.name, converted_entity.name) self.assertEqual(self.entity.examples, converted_entity.examples) self.assertEqual(self.entity.alias, converted_entity.alias) if __name__ __main__: unittest.main() 点击pycharm运行弹出这样的窗口 这个错误 Error: Provide a qualified name of a function, class or module 是因为 PyCharm 的运行配置中模块路径Module Name填写的格式不对。 PyCharm 试图把你输入的长字符串当作一个“模块”去加载但它包含了类名和方法名导致 Python 找不到这个模块。 ✅ 解决方法二选一 方法一修改当前配置推荐 请按照以下步骤调整你截图中的设置 切换模式将下拉菜单从 module 改为 Script path脚本路径。 选择文件点击右侧的文件夹图标 选择你的测试文件 2_test_column_info_mapper.py。 指定特定测试可选如果你想只运行这一个特定的测试方法在下方的 Additional arguments附加参数框中输入 text 编辑 TestColumnInfoMapper.test_to_entity 点击 Run。 方法二最简单的“懒人”办法 不需要打开这个复杂的配置窗口 关闭当前的 Edit Configuration 窗口。 回到代码编辑界面。 在代码左侧的行号栏旁边找到 class TestColumnInfoMapper 或者 def test_to_entity 左边的 绿色三角形图标 ▶️。 直接点击那个绿色三角形选择 Run Unittests in ...。 PyCharm 会自动为你生成正确的配置并运行。 为什么会报错原理解析 在你截图的配置中 Type: 选择了 module这意味着后面只能填类似 unittest 或 my_package.my_module 这种纯包路径。 Name: 你填了 ...TestColumnInfoMapper.test_to_entity。 Python 会尝试执行 import ...TestColumnInfoMapper.test_to_entity这显然是不合法的导入语法所以它提示你需要提供一个合法的“函数、类或模块名称”。 如果改完还报错可以把新的报错截图发给我看看。

相关新闻

gen_smtp安全配置:STARTTLS与多种认证方式的最佳实践

gen_smtp安全配置:STARTTLS与多种认证方式的最佳实践

gen_smtp安全配置:STARTTLS与多种认证方式的最佳实践 【免费下载链接】gen_smtp The extensible Erlang SMTP client and server library. 项目地址: https://gitcode.com/gh_mirrors/ge/gen_smtp 在当今数字化时代,邮件传输的安全性至关重要。ge…

2026/10/5 4:06:49 阅读更多 →
数据分析agent(十三):业务层和持久层的mapper相互转换

数据分析agent(十三):业务层和持久层的mapper相互转换

一,导入 数据库表1,强制删除名为 my-mysql 的容器docker rm -f my-mysql重新创建并启动新容器docker run -d --name my-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDhappy123 mysql:8.0.41 方法二:先停止,再删除(常规操…

2026/10/10 0:21:12 阅读更多 →
AI代码审查安全吗?从Claude Code看人机协同安全防线构建

AI代码审查安全吗?从Claude Code看人机协同安全防线构建

你刚把一段代码交给 Claude Code 审查,它迅速指出了几个潜在的安全漏洞,你松了口气,觉得这工具真不错。但紧接着,一个念头冒出来:如果这个审查工具本身就有问题呢?如果它漏掉了关键风险,或者更糟…

2026/10/14 9:20:29 阅读更多 →

最新新闻

MWORKS 2026a电力系统仿真新突破:NPSLibrary模型库解析

MWORKS 2026a电力系统仿真新突破:NPSLibrary模型库解析

1. 电力系统仿真领域的里程碑事件上周在杭州举办的电力系统仿真技术峰会上,国内工业软件龙头企业正式发布了MWORKS 2026a版本,其中最引人注目的就是全新推出的NPSLibrary(New Power System Library)模型库。作为一名在电力系统仿真…

2026/10/14 9:50:29 阅读更多 →
UNet3+改进版PyTorch实现:多尺度融合、深监督与轻量化的工程闭环

UNet3+改进版PyTorch实现:多尺度融合、深监督与轻量化的工程闭环

简介:本资源是面向深度学习初学者与医学图像分割实践者的UNet3模型实战教程包,聚焦解决图像分割任务中多尺度特征融合与精度提升难题,特别适用于肿瘤边界识别、器官定位等医疗AI场景。压缩包共2000个文件,含1418张PNG与193张JPG格…

2026/10/14 9:50:29 阅读更多 →
企业微信二次开发实战:如何搭建一个自动化消息处理系统

企业微信二次开发实战:如何搭建一个自动化消息处理系统

消息自动化不是写几个回调处理器就完事。消息量大了之后,超时、重复、乱序、积压这些问题会一个个冒出来。我们从一个简单的回调服务演进到能扛日均十万条消息的处理系统,中间加了队列、状态机、幂等、降级四层保障。这篇讲系统架构和每层解决的问题。 …

2026/10/14 9:50:29 阅读更多 →
AI求解器:用神经网络替代传统方程求解

AI求解器:用神经网络替代传统方程求解

1. 项目概述:当AI开始“算”而不是“写”方程你有没有过这种时刻:面对一个物理建模里的非线性微分方程组,手推解析解卡在第三步;调试一个控制算法时,雅可比矩阵求导反复出错;或者只是想快速知道某个复杂函数…

2026/10/14 9:50:29 阅读更多 →
Agent Infra:智能体基础设施的工程战场与工程师入场券

Agent Infra:智能体基础设施的工程战场与工程师入场券

1. 当所有人盯着模型参数时,真正的工程战场已经转移了过去一年多,我身边做算法的朋友聊天话题几乎被两件事占满:一是模型又刷新了什么榜单,二是推理成本又降了多少。但如果你真的在工业环境里交付过基于大模型的系统,就…

2026/10/14 9:50:29 阅读更多 →
基于Python的微博舆情分析与话题热度预测毕设实战指南

基于Python的微博舆情分析与话题热度预测毕设实战指南

简介:这份资源是面向计算机、电子信息工程、数学等专业大学生的课程设计或毕业设计参考资料,聚焦新浪微博#新冠疫情话题的舆情分析与话题热度预测。项目经导师指导并认可通过,适合作为大作业、期末课设或毕设的完整参考方案,帮助读…

2026/10/14 9:49:28 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →