当前位置: 首页 > news >正文

python: SQLAlchemy (ORM) Simple example using mysql in Ubuntu 24.04

mysql sql script:

create table School  表
(`SchoolId` char(5) NOT NULL comment'主鍵primary key,學校編號',`SchoolName` nvarchar(500) NOT NULL DEFAULT '' comment' 學校名稱',`SchoolTelNo`  varchar(8)  NULL DEFAULT '' comment'電話號碼',PRIMARY KEY (SchoolId)   #主鍵
)COMMENT='學校表 School Table' DEFAULT CHARSET=utf8;create table Teacher
(`TeacherId` char(5) NOT NULL comment'主鍵primary key,老师編號',`TeacherFirstName` nvarchar(100) NOT NULL DEFAULT '' comment' 名',`TeacherLastName` nvarchar(20) NOT NULL DEFAULT '' comment' 姓',`TeacherGender` char(2) NOT NULL DEFAULT '' comment'性別',`TeacherTelNo`  varchar(8)  NULL DEFAULT '' comment'電話號碼',`TeacherSchoolId`  char(5) NOT NULL DEFAULT '' comment'外鍵 foreign key 學校ID',PRIMARY KEY (TeacherId),   #主鍵FOREIGN KEY(TeacherSchoolId) REFERENCES School(SchoolId)  #外鍵
)COMMENT='老師表Teacher Table' DEFAULT CHARSET=utf8;

项目结构

领域层(Domain Layer)

# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : Ubuntu 24.0
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2025/2/20 20:23
# User      : geovindu
# Product   : PyCharm
# Project   : pyMySqlDDDOrmDemo
# File      : domain/entities/school.py
# explain   : 学习
'''
create table School  表
(`SchoolId` char(5) NOT NULL comment'主鍵primary key,學校編號',`SchoolName` nvarchar(500) NOT NULL DEFAULT '' comment' 學校名稱',`SchoolTelNo`  varchar(8)  NULL DEFAULT '' comment'電話號碼',PRIMARY KEY (SchoolId)   #主鍵
)COMMENT='學校表 School Table' DEFAULT CHARSET=utf8;'''class School:"""领域层(Domain Layer)定义业务实体"""def __init__(self, school_id, school_name, school_tel_no):""":param school_id: 學校編號:param school_name: 學校名稱:param school_tel_no:電話號碼"""self.school_id = school_idself.school_name = school_nameself.school_tel_no = school_tel_no# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : Ubuntu 24.0
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2025/2/20 20:27
# User      : geovindu
# Product   : PyCharm
# Project   : pyMySqlDDDOrmDemo
# File      : domain/repositories/school.py
# explain   : 学习
from abc import ABC, abstractmethod
from typing import List
from ..entities.school import Schoolclass SchoolRepository(ABC):"""领域层(Domain Layer)存储库接口"""@abstractmethoddef add(self, school: School):pass@abstractmethoddef update(self, school: School):pass@abstractmethoddef delete(self, school_id: str):"""删除:param school_id::return:"""passdef get_schoolall(self) -> List[School]:"""所有:return:"""pass@abstractmethoddef get_all(self, page: int, page_size: int, search_query: str = "") -> List[School]:"""分页:param page::param page_size::param search_query::return:"""pass@abstractmethoddef get_total_count(self, search_query: str = "") -> int:pass

基础设施层(Infrastructure Layer)

# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : Ubuntu 24.0
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2025/2/20 20:46
# User      : geovindu
# Product   : PyCharm
# Project   : pyMySqlDDDOrmDemo
# File      : infrastructure/model/school.py
# explain   : 学习from sqlalchemy import create_engine, Column, String, ForeignKey
from sqlalchemy.orm import sessionmaker, declarative_base, relationshipBase = declarative_base()class SchoolModel(Base):"""基础设施层(Infrastructure Layer)数据库交互分开会报错"""__tablename__ = 'School'SchoolId = Column(String(5), primary_key=True)SchoolName = Column(String(500), nullable=False, default='')SchoolTelNo = Column(String(8), nullable=True, default='')teachers = relationship("TeacherModel", back_populates="school")class TeacherModel(Base):"""基础设施层(Infrastructure)数据库交互"""__tablename__ = 'Teacher'TeacherId = Column(String(5), primary_key=True)TeacherFirstName = Column(String(100), nullable=False, default='')TeacherLastName = Column(String(20), nullable=False, default='')TeacherGender = Column(String(2), nullable=False, default='')TeacherTelNo = Column(String(8), nullable=True, default='')TeacherSchoolId = Column(String(5), ForeignKey('School.SchoolId'), nullable=False, default='')school = relationship("SchoolModel", back_populates="teachers")# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : Ubuntu 24.0
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2025/2/20 20:46
# User      : geovindu
# Product   : PyCharm
# Project   : pyMySqlDDDOrmDemo
# File      : infrastructure/repositories/school.py
# explain   : 学习
from sqlalchemy import create_engine, Column, String, ForeignKey
from sqlalchemy.orm import sessionmaker, declarative_base, relationship
from domain.entities.school import School
from ..model.school import SchoolModel
from ..database.mysqlHelper import MysqlHeler
from typing import List
class SchoolRepository:"""基础设施层(Infrastructure Layer)实现存储库接口"""def __init__(self):""""""self._Session = MysqlHeler()def add(self, school: School):""":param school::return:"""session = self._Session.getSession()school_model = SchoolModel(SchoolId=school.school_id, SchoolName=school.school_name,SchoolTelNo=school.school_tel_no)session.add(school_model)session.commit()session.close()def update(self, school: School):""":param school::return:"""session = self._Session.getSession()school_model = session.query(SchoolModel).filter_by(SchoolId=school.school_id).first()if school_model:school_model.SchoolName = school.school_nameschool_model.SchoolTelNo = school.school_tel_nosession.commit()session.close()def delete(self, school_id: str):""":param school_id::return:"""session = self._Session.getSession()school_model = session.query(SchoolModel).filter_by(SchoolId=school_id).first()if school_model:session.delete(school_model)session.commit()session.close()def get_schoolall(self) -> List[School]:"""查询所有所学校:return:"""session = self._Session.getSession()query = session.query(SchoolModel).all()'''li=[School(school.SchoolId, school.SchoolName, school.SchoolTelNo) for school in query]for i in li:print(i.school_id,i.school_name,i.school_tel_no)print("query", [School(school.SchoolId, school.SchoolName, school.SchoolTelNo) for school in query])'''session.close()return [School(school.SchoolId, school.SchoolName, school.SchoolTelNo) for school in query]def get_all(self, page: int, page_size: int, search_query: str = "") -> List[School]:""":param page::param page_size::param search_query::return:"""session = self._Session.getSession()query = session.query(SchoolModel)if search_query:query = query.filter((SchoolModel.SchoolId.contains(search_query)) |(SchoolModel.SchoolName.contains(search_query)) |(SchoolModel.SchoolTelNo.contains(search_query)))offset = (page - 1) * page_sizeschool_models = query.offset(offset).limit(page_size).all()session.close()return [School(school.SchoolId, school.SchoolName, school.SchoolTelNo) for school in school_models]def get_total_count(self, search_query: str = ""):""":param search_query::return:"""session = self._Session.getSession()query = session.query(SchoolModel)if search_query:query = query.filter((SchoolModel.SchoolId.contains(search_query)) |(SchoolModel.SchoolName.contains(search_query)) |(SchoolModel.SchoolTelNo.contains(search_query)))count = query.count()session.close()return count

应用层(Application Layer)

# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : Ubuntu 24.0
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2025/2/20 20:04
# User      : geovindu
# Product   : PyCharm
# Project   : pyMySqlDDDOrmDemo
# File      : application/services/school.py
# explain   : 学习from typing import List
from domain.entities.school import School
from domain.repositories.school import SchoolRepositoryclass SchoolService:"""应用层(Application Layer)封装业务逻辑。"""def __init__(self, repository: SchoolRepository):""":param repository:"""self.repository = repositorydef add_school(self, school: School):""":param school::return:"""self.repository.add(school)def update_school(self, school: School):""":param school::return:"""self.repository.update(school)def delete_school(self, school_id: str):""":param school_id::return:"""self.repository.delete(school_id)def get_schoolall(self) -> List[School]:"""所有:return:"""return self.repository.get_schoolall()def get_schools(self, page: int, page_size: int, search_query: str = "") -> List[School]:""":param page::param page_size::param search_query::return:"""return self.repository.get_all(page, page_size, search_query)def get_total_school_count(self, search_query: str = "") -> int:""":param search_query::return:"""return self.repository.get_total_count(search_query)

表现层(Presentation Layer)

# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : Ubuntu 24.0
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2025/2/20 20:47
# User      : geovindu
# Product   : PyCharm
# Project   : pyMySqlDDDOrmDemo
# File      : presentation/views/school.py
# explain   : 学习import tkinter as tk
from tkinter import ttkclass SchoolView(object):"""表现层(Presentation Layer)包含视图和控制器,处理用户界面和操作。"""def __init__(self, parent):""":param parent:"""self.frame = tk.Frame(parent)# 搜索框self.search_frame = ttk.Frame(self.frame)self.search_frame.pack(pady=10)self.search_entry = ttk.Entry(self.search_frame)self.search_entry.pack(side=tk.LEFT, padx=5)self.search_button = ttk.Button(self.search_frame, text="Search")self.search_button.pack(side=tk.LEFT)# Treeviewself.tree = ttk.Treeview(self.frame, columns=('SchoolId', 'SchoolName', 'SchoolTelNo'), show='headings')self.tree.heading('SchoolId', text='School ID')self.tree.heading('SchoolName', text='School Name')self.tree.heading('SchoolTelNo', text='School Tel No')self.tree.pack(pady=10)# 操作按钮self.button_frame = ttk.Frame(self.frame)self.button_frame.pack(pady=10)self.add_button = ttk.Button(self.button_frame, text="Add")self.add_button.pack(side=tk.LEFT, padx=5)self.edit_button = ttk.Button(self.button_frame, text="Edit")self.edit_button.pack(side=tk.LEFT, padx=5)self.delete_button = ttk.Button(self.button_frame, text="Delete")self.delete_button.pack(side=tk.LEFT, padx=5)# 分页按钮self.pagination_frame = ttk.Frame(self.frame)self.pagination_frame.pack(pady=10)self.prev_button = ttk.Button(self.pagination_frame, text="Previous")self.prev_button.pack(side=tk.LEFT, padx=5)self.page_label = ttk.Label(self.pagination_frame, text="Page 1 of 1")self.page_label.pack(side=tk.LEFT, padx=5)self.next_button = ttk.Button(self.pagination_frame, text="Next")self.next_button.pack(side=tk.LEFT, padx=5)def clear_tree(self):""":return:"""for item in self.tree.get_children():self.tree.delete(item)def populate_tree(self, schools):""":param schools::return:"""for school in schools:self.tree.insert('', 'end', values=(school.school_id, school.school_name, school.school_tel_no))def update_page_label(self, current_page, total_pages, tatol,pagesize):""":param current_page::param total_pages::param tatol:param pagesize:return:"""self.page_label.config(text=f"Page {current_page} of {total_pages}  {pagesize}/total:{tatol}")def open_add_window(self, save_callback):""":param save_callback::return:"""top = tk.Toplevel(self.frame)top.title("Add School")top.iconbitmap("favicon.ico")ttk.Label(top, text="School ID:").grid(row=0, column=0, padx=5, pady=5)id_entry = ttk.Entry(top)id_entry.grid(row=0, column=1, padx=5, pady=5)ttk.Label(top, text="School Name:").grid(row=1, column=0, padx=5, pady=5)name_entry = ttk.Entry(top)name_entry.grid(row=1, column=1, padx=5, pady=5)ttk.Label(top, text="School Tel No:").grid(row=2, column=0, padx=5, pady=5)tel_entry = ttk.Entry(top)tel_entry.grid(row=2, column=1, padx=5, pady=5)def save_school():""":return:"""school_id = id_entry.get()school_name = name_entry.get()school_tel_no = tel_entry.get()if school_id and school_name and school_tel_no:save_callback(school_id, school_name, school_tel_no)top.destroy()ttk.Button(top, text="Save", command=save_school).grid(row=3, column=0, columnspan=2, pady=10)def open_edit_window(self, school_id, school_name, school_tel_no, update_callback):""":param school_id::param school_name::param school_tel_no::param update_callback::return:"""top = tk.Toplevel(self.frame)top.title("Edit School")#top.iconbitmap("favicon.ico")ttk.Label(top, text="School ID:").grid(row=0, column=0, padx=5, pady=5)id_entry = ttk.Entry(top)id_entry.insert(0, school_id)id_entry.config(state='readonly')id_entry.grid(row=0, column=1, padx=5, pady=5)ttk.Label(top, text="School Name:").grid(row=1, column=0, padx=5, pady=5)name_entry = ttk.Entry(top)name_entry.insert(0, school_name)name_entry.grid(row=1, column=1, padx=5, pady=5)ttk.Label(top, text="School Tel No:").grid(row=2, column=0, padx=5, pady=5)tel_entry = ttk.Entry(top)tel_entry.insert(0, school_tel_no)tel_entry.grid(row=2, column=1, padx=5, pady=5)def update_school():""":return:"""new_school_name = name_entry.get()new_school_tel_no = tel_entry.get()if new_school_name and new_school_tel_no:update_callback(school_id, new_school_name, new_school_tel_no)top.destroy()ttk.Button(top, text="Update", command=update_school).grid(row=3, column=0, columnspan=2, pady=10)# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : Ubuntu 24.0
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2025/2/20 20:47
# User      : geovindu
# Product   : PyCharm
# Project   : pyMySqlDDDOrmDemo
# File      : presentation/controllers/school.py
# explain   : 学习import tkinter as tk
from application.services.school import SchoolService
from domain.entities.school import Schoolclass SchoolController(object):"""表现层(Presentation Layer)包含视图和控制器,处理用户界面和操作。"""def __init__(self, service: SchoolService, view):""":param service::param view:"""self.service = serviceself.view = viewself.current_page = 1self.page_size = 10self.search_query = ""self.total_pages = 1self.view.search_button.config(command=self.search)self.view.add_button.config(command=self.add)self.view.edit_button.config(command=self.edit)self.view.delete_button.config(command=self.delete)self.view.prev_button.config(command=self.prev_page)self.view.next_button.config(command=self.next_page)self.load_data()def load_data(self):""":return:"""schools = self.service.get_schools(self.current_page, self.page_size, self.search_query)total_count = self.service.get_total_school_count(self.search_query)self.total_pages = (total_count + self.page_size - 1) // self.page_sizeself.view.clear_tree()self.view.populate_tree(schools)self.view.update_page_label(self.current_page, self.total_pages,total_count,self.page_size)self.view.prev_button.config(state=tk.NORMAL if self.current_page > 1 else tk.DISABLED)self.view.next_button.config(state=tk.NORMAL if self.current_page < self.total_pages else tk.DISABLED)def search(self):""":return:"""self.search_query = self.view.search_entry.get()self.current_page = 1self.load_data()def add(self):""":return:"""def save_callback(school_id, school_name, school_tel_no):new_school = School(school_id, school_name, school_tel_no)self.service.add_school(new_school)self.load_data()self.view.open_add_window(save_callback)def edit(self):""":return:"""selected_item = self.view.tree.selection()if selected_item:values = self.view.tree.item(selected_item, 'values')school_id, school_name, school_tel_no = valuesdef update_callback(school_id, new_school_name, new_school_tel_no):updated_school = School(school_id, new_school_name, new_school_tel_no)self.service.update_school(updated_school)self.load_data()self.view.open_edit_window(school_id, school_name, school_tel_no, update_callback)def delete(self):""":return:"""selected_item = self.view.tree.selection()if selected_item:school_id = self.view.tree.item(selected_item, 'values')[0]self.service.delete_school(school_id)self.load_data()def prev_page(self):""":return:"""if self.current_page > 1:self.current_page -= 1self.load_data()def next_page(self):""":return:"""if self.current_page < self.total_pages:self.current_page += 1self.load_data()

调用:
 

# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司 ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:先安装: pip install --upgrade pip
#  pip install pymysql
#  pip install sqlalchemy
#  sudo apt install python3-tk
#  pip install pillow
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : Ubuntu 24.0
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2025/2/20 20:21
# User      : geovindu
# Product   : PyCharm
# Project   : pyMySqlDDDOrmDemo
# File      : main.py
# explain   : 学习
'''
DDD
定义业务实体和存储库接口
domain--entities--repositories基础设施层(Infrastructure)
实现存储库接口,与数据库交互。
infrastructure--database--model--repositories
应用层(Application)
封装业务逻辑。
application--services表现层(Presentation)
包含视图和控制器,处理用户界面和操作。
presentation--views--controllers'''import tkinter as tk
from infrastructure.repositories import SchoolRepository,TeacherRepository    # init 必须配置,才可以这样引用
from application.services import SchoolService, TeacherService
from presentation.views import SchoolView, TeacherView
from presentation.controllers import SchoolController, TeacherControllerif __name__ == '__main__':"""    主程序输出"""root = tk.Tk()root.title("学校老师管理系统")# 创建数据库存储库实例school_repository = SchoolRepository()teacher_repository = TeacherRepository()# 创建服务实例school_service = SchoolService(school_repository)teacher_service = TeacherService(teacher_repository)# 创建视图实例school_view = SchoolView(root)teacher_view = TeacherView(root)school_view.frame.pack_forget()teacher_view.frame.pack_forget()# 创建控制器实例school_controller = SchoolController(school_service, school_view)# 需要加上学校的务服实例。便于选择学校teacher_controller = TeacherController(teacher_service, school_service, teacher_view)# 创建主菜单menubar = tk.Menu(root)root.config(menu=menubar)# 创建主菜单下的子菜单main_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="管理菜单", menu=main_menu)# 学校管理子菜单school_menu = tk.Menu(main_menu, tearoff=0)main_menu.add_cascade(label="学校管理", menu=school_menu)school_menu.add_command(label="查看学校信息", command=lambda: (school_view.frame.pack(),teacher_view.frame.pack_forget()  # 隐藏))# 老师管理子菜单teacher_menu = tk.Menu(main_menu, tearoff=0)main_menu.add_cascade(label="老师管理", menu=teacher_menu)teacher_menu.add_command(label="查看老师信息", command=lambda: (teacher_view.frame.pack(),school_view.frame.pack_forget()   # 隐藏))#root.iconbitmap(delattr="favicon.ico")#root.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(file='favicon.ico'))root.mainloop()print('PyCharm,geovindu,Geovin Du,涂聚文!')

输出:

相关文章:

python: SQLAlchemy (ORM) Simple example using mysql in Ubuntu 24.04

mysql sql script: create table School 表 (SchoolId char(5) NOT NULL comment主鍵primary key&#xff0c;學校編號,SchoolName nvarchar(500) NOT NULL DEFAULT comment 學校名稱,SchoolTelNo varchar(8) NULL DEFAULT comment電話號碼,PRIMARY KEY (SchoolId) #主…...

如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单

随着信息泄露和数据安全问题的日益突出&#xff0c;保护敏感信息变得尤为重要。加密 PDF 文件是一种有效的手段&#xff0c;可以确保只有授权用户才能访问或修改文档内容。本文将详细介绍如何使用 CleverPDF 在线工具为你的 PDF 文件添加密码保护&#xff0c;确保其安全性。 为…...

echarts 折线图动态基准线设置超出基准线标红

基准线属性&#xff1a;markLine 线条标红关键属性&#xff1a;visualMap 小于&#xff1a; lt (less than) 大于&#xff1a;gt (greater than) 小于等于&#xff1a;lte (Less than or equal to) 大于等于&#xff1a;gte (Greater than or equal to) 1、基础应用——2条基准…...

Part 3 第十二章 单元测试 Unit Testing

概述 第十二章围绕单元测试展开&#xff0c;阐述了单元测试的实践与重要性&#xff0c;通过对比其他测试类型&#xff0c;突出其特点&#xff0c;还介绍了单元测试的最佳实践、避免的反模式以及与测试替身相关的内容&#xff0c;为编写高质量单元测试提供指导。 章节概要 1…...

C++与Python:两种编程语言的区别

C和Python都是当今编程领域广泛使用的语言&#xff0c;它们各有特色&#xff0c;适用于不同的开发场景。本文将从语言特性、性能、学习难度、应用领域等多个方面探讨C与Python之间的区别。 一、语言特性 类型系统&#xff1a; C&#xff1a;是一种静态类型语言&#xf…...

Springboot 高频面试题

以下是Spring Boot的高频面试题及答案和底层原理解释&#xff1a; 基础概念 什么是Spring Boot&#xff0c;其主要特点是什么&#xff1f; 答案&#xff1a; Spring Boot本质上是一个建立在Spring框架之上的快速应用开发框架。其主要特点包括&#xff1a; 启动器&#xff1a;一…...

常用电脑,护眼软件推荐 f.lux 3400K | 撰写论文 paper

常用电脑&#xff1f;平均每天用 5 个小时&#xff1f;你就要考虑用一个护眼软件了&#xff0c;对皮肤也好。因为电脑屏幕有辐射&#xff0c;比如蓝光。 f.lux 作为一款专业护眼软件&#xff0c;值得使用。之前用了三年的 Iris Pro&#xff0c;现在 f.lux 做的更好了。 使用…...

MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用

目录 1 大白话说一下文章内容2 作者的电脑配置3 DeepSeek的本地部署3.1 Ollamal的下载和安装3.2 选择合适的deepseek模型3.3 安转deepseek 4 DifyDeepSeek构建Al应用4.1 Dify的安装4.1.1 前置条件4.1.2 拉取代码4.1.3 启动Dify 4.2 Dify控制页面4.3 使用Dify实现个“文章标题生…...

如何有效利用MYSQL的连接数

连接数配置2500~3000 依然发现连接不够用&#xff1f; -- 查看当前最大连接数 SHOW VARIABLES LIKE MAX_CONNECTIONS; -- 查看当前总链接数 SHOW STATUS LIKE Threads_connected; -- 查看当前进程明细 SHOW PROCESSLIST; 合理设置以下参数&#xff1a; 1. MySQL 的参数设置 …...

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时&#xff0c;Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…...

使用Hardhat实现ERC20 代币合约详解

ERC20 代币合约详解 &#x1f4b0; 1. 合约概览 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20;import "openzeppelin/contracts/token/ERC20/ERC20.sol";contract MyToken is ERC20 {constructor() ERC20("MyToken", "MTK") {_min…...

清华大学《DeepSeek与AI幻觉》(无套路免费分享)

随着人工智能技术的飞速发展&#xff0c;以DeepSeek为代表的国产大模型正逐渐成为各行各业的重要工具。然而&#xff0c;AI在生成内容时常常会出现“幻觉”——即生成与事实不符、逻辑断裂或脱离上下文的内容。 清华大学新闻与传播学院与人工智能学院联合推出的这篇教程《Deep…...

代码随想录算法【Day52】

Day51 101. 孤岛的总面积 思路 从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋&#xff0c;然后再去重新遍历地图 统计此时还剩下的陆地 代码 #include <iostream> #include <vector> using namespace std; int dir[4][2] {-1, 0, …...

Spark 和 Flink

Spark 和 Flink 都是目前流行的大数据处理引擎&#xff0c;但它们在架构设计、应用场景、性能和生态方面有较大区别。以下是详细对比&#xff1a; 1. 架构与核心概念 方面Apache SparkApache Flink计算模型微批&#xff08;Micro-Batch&#xff09;为主&#xff0c;但支持结构…...

Unity结合Vuforia虚拟按键实现AR机械仿真动画效果

零、最终效果 待上传 一、资源准备 1、Vuforia Vuforia版本不能高于10.17.4&#xff08;往上的版本虚拟按键功能被删除&#xff09; 2、Unity Unity版本必须要高于2022.3.x&#xff0c;不然使用Vuforia插件时会出现bug 二、主要内容 1、添加虚拟按钮 2、为虚拟按钮设置…...

PL/SQL 异常处理

目录 一、命名的系统异常 1.常见命名的系统异常 2.预定义的系统异常数量以及描述 3.处理命名的系统异常的一般步骤 二、程序员定义的异常 1.概念 2.自定义异常的定义与抛出 3.自定义异常的处理 三、未命名的系统异常 1.概述 2.处理未命名的系统异常的方法 3.使用场景 …...

【自学笔记】Spring Boot框架技术基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Spring Boot框架技术基础知识点总览一、Spring Boot简介1.1 什么是Spring Boot&#xff1f;1.2 Spring Boot的主要特性 二、Spring Boot快速入门2.1 搭建Spring Boo…...

Redis 缓存穿透、击穿、雪崩:问题与解决方案

在使用 Redis 作为缓存中间件时&#xff0c;系统可能会面临一些常见的问题&#xff0c;如 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决&#xff0c;可能会导致数据库压力过大、系统响应变慢甚至崩溃。本文将详细分析这三种问题的起因&#xff0c;并提供有效的解决…...

第一个CMAKE项目hello cmake

#注意&#xff01; 这篇文章是为WINDWOS用户写的 #请检查你的电脑上已经安装了MINGW和CMAKE 快速检查方法如下 C:\Users\Basicoperation>g --version g (x86_64-win32-seh-rev1, Built by MinGW-Builds project) 14.2.0 Copyright (C) 2024 Free Software Foundation, Inc. …...

骶骨神经

骶骨肿瘤手术后遗症是什么_39健康网_癌症 [健康之路]匠心仁术&#xff08;七&#xff09; 勇闯禁区 骶骨肿瘤切除术...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...