python: DDD using postgeSQL and SQL Server
postgreSQL
注意:
# psycopg 2 驱动的连接字符串
#engine = create_engine('postgresql://post:geovindu@localhost:5433/TechnologyGame')
#Session = sessionmaker(bind=engine)# 使用 psycopg3 驱动的连接字符串
#engine = create_engine('postgresql+psycopg://user:geovindu@localhost:5432/TechnologyGame')
#Session = sessionmaker(bind=engine)
create table School -- 創建表
(SchoolId char(5) NOT NULL PRIMARY KEY, SchoolName varchar(500) NOT NULL DEFAULT '', SchoolTelNo varchar(8) NULL DEFAULT ''
);create table Teacher -- 創建表
(TeacherId char(5) NOT NULL ,TeacherFirstName varchar(100) NOT NULL DEFAULT '', TeacherLastName varchar(20) NOT NULL DEFAULT '',TeacherGender char(2) NOT NULL DEFAULT '',TeacherTelNo varchar(8) NULL DEFAULT '',TeacherSchoolId char(5) NOT NULL DEFAULT '', PRIMARY KEY (TeacherId), -- 主鍵FOREIGN KEY(TeacherSchoolId) REFERENCES School(SchoolId) -- 外鍵
);
项目结构:
# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, postgreSQL 17.0 oracle 21c Neo4j
# Datetime : 2025/3/6 22:51
# User : geovindu
# Product : PyCharm
# Project : pypostgreSQLDDDOrmDemo
# File : teacher.py
# explain : 学习
from sqlalchemy import create_engine, Column, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, declarative_base, relationshipBase = declarative_base()''' '''
class SchoolModel(Base):"""必须小写字母"""__tablename__ = 'school'schoolid = Column(String(5), primary_key=True)schoolname = Column(String(500), default='')schooltelno = Column(String(8), default='')teachers = relationship("TeacherModel", back_populates="school")class TeacherModel(Base):"""必须小写字母"""__tablename__ = 'teacher'teacherid = Column(String(5), primary_key=True)teacherfirstname = Column(String(100), default='')teacherlastname = Column(String(20), default='')teachergender = Column(String(2), default='')teachertelno = Column(String(8), default='')teacherschoolid = Column(String(5), ForeignKey(SchoolModel.schoolid))school = relationship("SchoolModel", back_populates="teachers")
# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, postgreSQL 17.0 oracle 21c Neo4j
# Datetime : 2025/3/6 22:58
# User : geovindu
# Product : PyCharm
# Project : pypostgreSQLDDDOrmDemo
# File : teacher.py
# explain : 学习
from domain.repositories.teacher import TeacherRepository
from infrastructure.database.postgresqlHelper import PostgresqlHelper
from infrastructure.model.teacher import TeacherModel
from domain.entities.teacher import Teacherclass TeacherRepositoryImpl(TeacherRepository):""""""def __init__(self):self.sesion = PostgresqlHelper()def get_all(self, page=1, page_size=10, keyword=''):""":param page::param page_size::param keyword::return:"""session = self.sesion.getSession()try:offset = (page - 1) * page_sizequery = session.query(TeacherModel)print(query)#query = query.order_by(TeacherModel.teacherid)#total = query.count()#print("total", total)if keyword:query = query.filter((TeacherModel.teacherfirstname.contains(keyword)) |(TeacherModel.teacherlastname.contains(keyword)))teachers =query.offset(offset).limit(page_size).all() # query.offset(offset).limit(page_size).all()print("data teachers",teachers)return [Teacher(teacher.teacherid, teacher.teacherfirstname, teacher.teacherlastname, teacher.teachergender, teacher.teachertelno, teacher.teacherschoolid) for teacher in teachers]except Exception as ex:print(ex.__str__())print(f"Error fetching teachers: {ex}")#return [] # 返回空列表而不是 Nonefinally:session.close()def get_by_id(self, teacher_id):""":param teacher_id::return:"""session = self.sesion.getSession()try:teacher = session.query(TeacherModel).filter_by(teacher_id=teacher_id).first()if teacher:return Teacher(teacher.teacherid, teacher.teacherfirstname, teacher.teacherlastname, teacher.teachergender, teacher.teachertelno, teacher.teacherschoolid)return Nonefinally:session.close()def add(self, teacher: Teacher):""":param teacher::return:"""session = self.sesion.getSession()try:new_teacher = TeacherModel(teacher_id=teacher.teacher_id, first_name=teacher.first_name, last_name=teacher.last_name, gender=teacher.gender, tel_no=teacher.tel_no, school_id=teacher.school_id)session.add(new_teacher)session.commit()except:session.rollback()raisefinally:session.close()def update(self, teacher: Teacher):""":param teacher::return:"""session = self.sesion.getSession()try:existing_teacher = session.query(TeacherModel).filter_by(teacher_id=teacher.teacher_id).first()if existing_teacher:existing_teacher.first_name = teacher.first_nameexisting_teacher.last_name = teacher.last_nameexisting_teacher.gender = teacher.genderexisting_teacher.tel_no = teacher.tel_noexisting_teacher.school_id = teacher.school_idsession.commit()except:session.rollback()raisefinally:session.close()def delete(self, teacher_id):""":param teacher_id::return:"""session = self.sesion.getSession()try:teacher = session.query(TeacherModel).filter_by(teacher_id=teacher_id).first()if teacher:session.delete(teacher)session.commit()except:session.rollback()raisefinally:session.close()def get_total_count(self, keyword=''):""":param keyword::return:"""session = self.sesion.getSession()try:query = session.query(TeacherModel)if keyword:query = query.filter((TeacherModel.first_name.contains(keyword)) |(TeacherModel.last_name.contains(keyword)))count = query.count()return countexcept Exception as e:print(f"Error getting total count: {e}")return 0finally:session.close()
sql server:
create table School -- 創建表
(SchoolId char(5) NOT NULL PRIMARY KEY, -- 學校編號SchoolName nvarchar(500) NOT NULL DEFAULT '', -- 學校名稱',SchoolTelNo varchar(8) NULL DEFAULT '' , -- 電話號碼 );
create table Teacher -- 創建表
(TeacherId char(5) NOT NULL , --'主鍵primary key,學生編號',TeacherFirstName nvarchar(100) NOT NULL DEFAULT '', -- ' 名',TeacherLastName nvarchar(20) NOT NULL DEFAULT '', -- ' 姓',TeacherGender char(2) NOT NULL DEFAULT '', -- '性別',TeacherTelNo varchar(8) NULL DEFAULT '', --'電話號碼',TeacherSchoolId char(5) NOT NULL DEFAULT '', -- '外鍵 foreign key 學校ID', PRIMARY KEY (TeacherId), -- 主鍵FOREIGN KEY(TeacherSchoolId) REFERENCES School(SchoolId) -- 外鍵
)
项目结构:
# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, postgreSQL 17.0 oracle 21c Neo4j
# Datetime : 2025/2/20 20:46
# User : geovindu
# Product : PyCharm
# Project : pyMsSqlDDDOrmDemo
# File : infrastructure/model/teacher.py
# explain : 学习
from sqlalchemy import create_engine, Column, String, ForeignKey
from sqlalchemy.orm import sessionmaker, declarative_base, relationship
from ..database.mssqlHelper import MssqlHelperBase = declarative_base()class SchoolModel(Base):"""基础设施层(Infrastructure)数据库交互"""__tablename__ = 'School'SchoolId = Column(String(5), primary_key=True)SchoolName = Column(String(500), default='')SchoolTelNo = Column(String(8), default='')teachers = relationship("TeacherModel", back_populates="school")class TeacherModel(Base):"""基础设施层(Infrastructure)数据库交互"""__tablename__ = 'Teacher'TeacherId = Column(String(5), primary_key=True)TeacherFirstName = Column(String(100), default='')TeacherLastName = Column(String(20), default='')TeacherGender = Column(String(2), default='')TeacherTelNo = Column(String(8), default='')TeacherSchoolId = Column(String(5), ForeignKey('School.SchoolId'))school = relationship("SchoolModel", back_populates="teachers")
# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, postgreSQL 17.0 oracle 21c Neo4j
# Datetime : 2025/2/20 20:47
# User : geovindu
# Product : PyCharm
# Project : pyMsSqlDDDOrmDemo
# File : infrastructure/repositories/teacher.py
# explain : 学习from sqlalchemy import create_engine, Column, String, ForeignKey
from sqlalchemy.orm import sessionmaker, declarative_base, relationship
from domain.entities.teacher import Teacher
from domain.entities.school import School
from ..database.mssqlHelper import MssqlHelper
from ..model.teacher import TeacherModel
from sqlalchemy.exc import SQLAlchemyErrorclass TeacherRepository:"""基础设施层(Infrastructure)实现存储库接口"""def __init__(self):""""""self._Session = MssqlHelper()def add(self, teacher: Teacher):""":param teacher::return:"""session = self._Session.getSession()teacher_model = TeacherModel(TeacherId=teacher.teacher_id, TeacherFirstName=teacher.first_name,TeacherLastName=teacher.last_name, TeacherGender=teacher.gender,TeacherTelNo=teacher.tel_no, TeacherSchoolId=teacher.school_id)session.add(teacher_model)session.commit()session.close()def update(self, teacher: Teacher):""":param teacher::return:"""session = self._Session.getSession()teacher_model = session.query(TeacherModel).filter_by(TeacherId=teacher.teacher_id).first()if teacher_model:teacher_model.TeacherFirstName = teacher.first_nameteacher_model.TeacherLastName = teacher.last_nameteacher_model.TeacherGender = teacher.genderteacher_model.TeacherTelNo = teacher.tel_noteacher_model.TeacherSchoolId = teacher.school_idsession.commit()session.close()def update_teacher_and_school(self, teacher_id, first_name, last_name, gender, tel_no, school_id, school_name,school_tel_no):""":param teacher_id::param first_name::param last_name::param gender::param tel_no::param school_id::param school_name::param school_tel_no::return:"""session = self._Session.getSession()try:# 更新老师信息teacher = session.query(Teacher).filter_by(TeacherId=teacher_id).first()if teacher:teacher.TeacherFirstName = first_nameteacher.TeacherLastName = last_nameteacher.TeacherGender = genderteacher.TeacherTelNo = tel_noteacher.TeacherSchoolId = school_id# 更新关联学校信息school = session.query(School).filter_by(SchoolId=school_id).first()if school:school.SchoolName = school_nameschool.SchoolTelNo = school_tel_nosession.commit()except Exception as e:session.rollback()raise efinally:session.close()def delete(self, teacher_id: str):""":param teacher_id::return:"""session = self._Session.getSession()teacher_model = session.query(TeacherModel).filter_by(TeacherId=teacher_id).first()if teacher_model:session.delete(teacher_model)session.commit()session.close()def get_all(self, page: int, page_size: int, search_query: str = ""):""":param page::param page_size::param search_query::return:"""session = self._Session.getSession()query = session.query(TeacherModel)if search_query:query = query.filter((TeacherModel.TeacherId.contains(search_query)) |(TeacherModel.TeacherFirstName.contains(search_query)) |(TeacherModel.TeacherLastName.contains(search_query)) |(TeacherModel.TeacherGender.contains(search_query)) |(TeacherModel.TeacherTelNo.contains(search_query)) |(TeacherModel.TeacherSchoolId.contains(search_query)))offset = (page - 1) * page_sizequery = query.order_by(TeacherModel.TeacherId) # 这里以 TeacherId 为例进行排序,你可以根据实际需求修改排序字段total = query.count()#print(" teacher total", total)teacher_models = query.offset(offset).limit(page_size).all()session.close()return [Teacher(teacher.TeacherId, teacher.TeacherFirstName, teacher.TeacherLastName,teacher.TeacherGender, teacher.TeacherTelNo, teacher.TeacherSchoolId)for teacher in teacher_models]def get_total_count(self, search_query: str = ""):""":param search_query::return:"""session = self._Session.getSession()query = session.query(TeacherModel)if search_query:query = query.filter((TeacherModel.TeacherId.contains(search_query)) |(TeacherModel.TeacherFirstName.contains(search_query)) |(TeacherModel.TeacherLastName.contains(search_query)) |(TeacherModel.TeacherGender.contains(search_query)) |(TeacherModel.TeacherTelNo.contains(search_query)) |(TeacherModel.TeacherSchoolId.contains(search_query)))count = query.count()session.close()return count
输出:
相关文章:

python: DDD using postgeSQL and SQL Server
postgreSQL 注意: # psycopg 2 驱动的连接字符串 #engine create_engine(postgresql://post:geovindulocalhost:5433/TechnologyGame) #Session sessionmaker(bindengine)# 使用 psycopg3 驱动的连接字符串 #engine create_engine(postgresqlpsycopg://user:g…...

Python实例:PyMuPDF实现PDF翻译,英文翻译为中文,并按段落创建中文PDF
基于PyMuPDF与百度翻译的PDF翻译处理系统开发:中文乱码解决方案与自动化排版实践 一 、功能预览:将英文翻译为中文后创建的PDF 二、完整代码 from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle...

IntelliJ IDEA 2021版创建springboot项目的五种方式
第一种方式,通过https://start.spring.io作为spring Initializr的url来创建项目。 第二种方式,通过https://start.spring.io官网来直接创建springboot项目压缩包,然后导入至我们的idea中。 点击generate后,即可生成压缩包…...

c#面试题整理6
1.String类能否被继承,为什么 可以看到String类的修饰符是sealed,即是密封类,故不可被继承 2.一个对象的方法是否只能由一个线程访问 不是,但是可通过同步机制,确保同一个时间只有一个线程访问 3.计算2*8ÿ…...
跟着 Lua 5.1 官方参考文档学习 Lua (12)
文章目录 5.7 – Input and Output Facilities补充内容io.input ([file])io.read ()io.write ()io.output ([file])io.lines ([filename])io.flush ()io.close ([file])io.open (filename [, mode])io.popen (prog [, mode])io.tmpfile ()io.type (ob)file:read ()file:lines (…...

大语言模型中的归一化技术:LayerNorm与RMSNorm的深入研究
在LLama等大规模Transformer架构的语言模型中,归一化模块是构建网络稳定性的关键组件。本文将系统分析归一化技术的必要性,并详细阐述为何原始Transformer架构中的LayerNorm在LLama模型中被RMSNorm所替代的技术原理。 归一化技术的基础原理 归一化的核…...
nodejs使用WebSocket实现聊天效果
在nodejs中使用WebSocket实现聊天效果(简易实现) 安装 npm i ws 实现 创建 server.js /*** 创建一个 WebSocket 服务器,监听指定端口,并处理客户端连接和消息。** param {Object} WebSocket - 引入的 WebSocket 模块,…...

【仿muduo库one thread one loop式并发服务器实现】
文章目录 一、项目介绍1-1、项目总体简介1-2、项目开发环境1-3、项目核心技术1-4、项目开发流程1-5、项目如何使用 二、框架设计2-1、功能模块划分2-1-1、SERVER模块2-1-2、协议模块 2-2、项目蓝图2-2-1、整体图2-2-2、模块关系图2-2-2-1、Connection 模块关系图2-2-2-2、Accep…...

10.2 继承与多态
文章目录 继承多态 继承 继承的作用是代码复用。派生类自动获得基类的除私有成员外的一切。基类描述一般特性,派生类提供更丰富的属性和行为。在构造派生类时,其基类构造函数先被调用,然后是派生类构造函数。在析构时顺序刚好相反。 // 基类…...

Go红队开发—格式导出
文章目录 输出功能CSV输出CSV 转 结构体结构体 转 CSV端口扫描结果使用CSV格式导出 HTML输出Sqlite输出nmap扫描 JSONmap转json结构体转jsonjson写入文件json编解码json转结构体json转mapjson转string练习:nmap扫描结果导出json格式 输出功能 在我们使用安全工具的…...

线性代数之矩阵特征值与特征向量的数值求解方法
文章目录 前言1. 幂迭代法(Power Iteration)幂法与反幂法求解矩阵特征值幂法求最大特征值编程实现补充说明 2. 逆幂迭代法(Inverse Iteration)移位反幂法 3. QR 算法(QR Algorithm)——稠密矩阵理论推导编程…...

Spring MVC源码分析のinit流程
文章目录 前言一、 init1.1、createWebApplicationContext1.2、onRefresh 二、请求处理器2.1、RequestMapping2.2、Controller接口2.3、HttpRequestHandler接口2.4、HandlerFunction 三、initHandlerMappings3.1、getDefaultStrategies3.1.1、RequestMappingHandlerMapping3.1.…...

【后端开发】go-zero微服务框架实践(goland框架对比,go-zero开发实践,文件上传问题优化等等)
【后端开发】go-zero微服务框架实践(goland框架对比,go-zero开发实践,文件上传问题优化等) 文章目录 1、go框架对比介绍2、go-zero 微服务开发实践3、go-zero 文件上传问题优化 1、go框架对比介绍 国内开源goland框架对比 1 go-…...

C#程序加密与解密Demo程序示例
目录 一、加密程序功能介绍 1、加密用途 2、功能 3、程序说明 4、加密过程 5、授权的注册文件保存方式 二、加密程序使用步骤 1、步骤一 编辑2、步骤二 3、步骤三 4、步骤四 三、核心代码说明 1、获取电脑CPU 信息 2、获取硬盘卷标号 3、机器码生成 3、 生成…...

小程序事件系统 —— 33 事件传参 - data-*自定义数据
事件传参:在触发事件时,将一些数据作为参数传递给事件处理函数的过程,就是事件传参; 在微信小程序中,我们经常会在组件上添加一些自定义数据,然后在事件处理函数中获取这些自定义数据,从而完成…...
深入解析 JavaScript 原型与原型链:从原理到应用
原型和原型链是 JavaScript 中实现对象继承和属性查找的核心机制。为了更深入地理解它们,我们需要从底层原理、实现机制以及实际应用等多个角度进行分析。 1. 原型(Prototype) 1.1 什么是原型? 每个 JavaScript 对象(…...

关于AI数据分析可行性的初步评估
一、结论:可在部分环节嵌入,无法直接处理大量数据 1.非本地部署的AI应用处理非机密文件没问题,内部文件要注意数据安全风险。 2.AI(指高规格大模型)十分适合探索性研究分析,对复杂报告无法全流程执行&…...

回归预测 | Matlab实现GWO-BP-Adaboost基于灰狼算法优化BP神经网络结合Adaboost思想的回归预测
回归预测 | Matlab实现GWO-BP-Adaboost基于灰狼算法优化BP神经网络结合Adaboost思想的回归预测 目录 回归预测 | Matlab实现GWO-BP-Adaboost基于灰狼算法优化BP神经网络结合Adaboost思想的回归预测回归效果基本介绍GWO-BP-Adaboost:基于灰狼算法优化BP神经网络结合Adaboost思想…...
ARM Cortex-M 内存映射详解:如何基于寄存器直接读写 寄存器映射方式编码程序 直接操作硬件寄存器来控制 MCU
ARM Cortex-M 的系统映射空间 在 STM32 等 ARM Cortex-M 系列 MCU 中,内存地址空间按照 存储功能 进行了严格划分,包括 Flash(程序存储)、RAM(数据存储)、外设寄存器(GPIO、UART、SPI 等&am…...

深度学习实战车辆目标跟踪与计数
本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化,该数据集包含丰富的车辆目标图像样本…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...