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

输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31455.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【redis】string类型相关操作:SET、GET、MSET、MGET、SETNX、SETEX、PSETEX

文章目录 二进制存储编码转换SET 和 GETSETGET MSET 和 MGETSETNX、SETEX 和 PSETEX Redis 所有的 key 都是字符串,value 的类型是存在差异的 二进制存储 Redis 中的字符串,直接就是按照二进制数据的方式存储的 不仅仅可以存储文本数据,还可…

嵌入式设备的功能安全和信息安全?

在现代社会中,嵌入式设备已经无处不在,从我们日常生活中的智能家居,到工业控制、医疗设备等各个行业,嵌入式设备的应用层出不穷。 那么,嵌入式设备的功能安全和信息安全究竟有什么不同,又如何保证它们在实…

爬虫案例七Python协程爬取视频

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Python协程爬取视频 前言 提示:这里可以添加本文要记录的大概内容: 爬虫案例七协程爬取视频 提示:以下是本篇文章正文…

【C++指南】一文总结C++类和对象【中】

🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C类和对象的语法知识。注意:在本章节中,小编会以Date类举例 👍 如果觉得…

Python 入

Python 入侵交换机 随着网络安全威胁不断增加,对于网络设备的安全防护变得愈发重要。而交换机作为网络中重要的设备之一,也需要加强安全保护。本文将介绍如何利用Python来入侵交换机,并对其进行漏洞扫描和安全检测。 1. Python 入侵交换机原…

『PostgreSQL』PGSQL备份与还原实操指南

📣读完这篇文章里你能收获到 了解逻辑备份与物理备份的区别及适用场景🔍。掌握全库、指定库、指定表备份还原的命令及参数📝。学会如何根据业务需求选择合适的备份策略📊。熟悉常见备份还原问题的排查与解决方法🔧。 …

《Python实战进阶》No20: 网络爬虫开发:Scrapy框架详解

No20: 网络爬虫开发:Scrapy框架详解 摘要 本文深入解析Scrapy核心架构,通过中间件链式处理、布隆过滤器增量爬取、Splash动态渲染、分布式指纹策略四大核心技术,结合政府数据爬取与动态API逆向工程实战案例,构建企业级爬虫系统。…

Spring Boot整合WebSocket

目录 ?引言 1.WebSocket 基础知识 ?1.1 什么是 WebSocket? ?1.2 WebSocket 的应用场景 ?2.Spring Boot WebSocket 整合步骤 2.1 创建 Spring Boot 项目 2.2 添加 Maven 依赖 2.3 配置 WebSocket 2.4 创建 WebSocket 控制器 2.5 创建前端页面 引言 在…

《OkHttp:工作原理 拦截器链深度解析》

目录 一、OKHttp 的基本使用 1. 添加依赖 2. 发起 HTTP 请求 3. 拦截器(Interceptor) 4. 高级配置 二、OKHttp 核心原理 1. 责任链模式(Interceptor Chain) 2. 连接池(ConnectionPool) 3. 请求调度…

【前端】BOM DOM

两天更新完毕,建议关注收藏点赞 友情链接: HTML&CSS&LESS&Bootstrap&Emmet Axios & AJAX & Fetch BOM DOM 待整理 js2 Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM)。官方文档点击跳转 目录 BOMDOM…

产品需求分析-概览

产品需求分析-概览 产品需求分析(上)-理论流程 需求产生(来源) 公司内部(老板、其他部门同事)产品经理自己(策划、挖掘)外部(用户、客户、伙伴) 需求分类 功能类数据类运营类体验类设计类 需求决策 战略定位产品定位用户需求 需求分位:四象限定位法 重要又…

小程序事件系统 —— 32 事件系统 - 事件分类以及阻止事件冒泡

在微信小程序中,事件分为 冒泡事件 和 非冒泡事件 : 冒泡事件:当一个组件的事件被触发后,该事件会向父节点传递;(如果父节点中也绑定了一个事件,父节点事件也会被触发,也就是说子组…

spring6概述

spring6 1、概述 1.1、Spring是什么?1.2、Spring 的狭义和广义1.3、Spring Framework特点1.4、Spring模块组成1.5、Spring6特点 1.5.1、版本要求 2.2、构建模块2.3、程序开发 2.3.1、引入依赖2.3.3、创建配置文件2.3.4、创建测试类测试2.3.5、运行测试程序 2.4、程序…

【Linux docker】关于docker启动出错的解决方法。

无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件(可能是配置的时候格式错误):/etc/docker/daemon.json(如果存在&#xf…

CTF网络安全题库 CTF网络安全大赛答案

此题解仅为部分题解,包括: 【RE】:①Reverse_Checkin ②SimplePE ③EzGame 【Web】①f12 ②ezrunner 【Crypto】①MD5 ②password ③看我回旋踢 ④摩丝 【Misc】①爆爆爆爆 ②凯撒大帝的三个秘密 ③你才是职业选手 一、 Re ① Reverse Chec…

1.1 双指针专题:移动零(easy)

一、题目链接 283. 移动零 二、题目描述 给定⼀个数组 nums ,编写⼀个函数将所有 0 移动到数组的末尾,同时保持⾮零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进⾏操作。 ⽰例 1: 输⼊: nums [0,1,0,3,12] 输出: […

STM32如何精准控制步进电机?

在工业自动化、机器人控制等场合,步进电机以其高精度、开环控制的特性得到了广泛应用。而在嵌入式系统中,使用STM32进行步进电机的精确控制,已成为开发者的首选方案之一。 本文将从嵌入式开发者的角度,深入探讨如何基于STM32 MCU…

Android Studio右上角Gradle 的Task展示不全

Android Studio 版本如下:Android Studio lguana|2023.21, 发现Gradle 的Tasks阉割严重,如下图,只显示一个other 解决方法如下:**Setting>Experimental>勾选Configure all gradle tasks during Gradle Sync(this can make…

华为hcia——Datacom实验指南——三层交换和ARP的工作原理

什么是三层交换 三层交换是指连接在同一台三层交换机上,不同vlan用户,不同网段ip,通过vlanif接口进行数据交换。 什么是ARP协议 通过网络层的ip地址解析成数据链路层的mac地址。 说白了就是通过目标ip地址去问他对应的mac地址是多少。 A…

【互联网性能指标】QPS/TPS/PV/UV/IP/GMV/DAU/MAU/RPS

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…