首页 文章 精选 留言 我的

精选列表

搜索[全栈信创],共10000篇文章
优秀的个人博客,低调大师

⚡一键生成,全栈贯通 - Fetcher v2.3.0 发布!

🚀 Fetcher 超轻量级 • 模块化 • TypeScript 优先 • 拦截器驱动 • LLM 流式 API 支持 Fetcher v2.3.0 发布日志 🎊激动人心的时刻到了!Fetcher v2.3.0 正式发布!这个版本带来了革命性的代码生成器和一系列强大的新特性,让您的开发体验更加流畅高效! ✨ 重磅新功能 🚀全新代码生成器(Generator) 🎯 OpenAPI 3.0+ 支持:完整支持 OpenAPI 3.0+ 规范(JSON/YAML) 📦 TypeScript 代码生成:生成类型安全的 TypeScript 接口、枚举和类 🏗️ 领域驱动设计:专为Wow框架打造,支持聚合、命令、查询和领域事件 🔧 CLI 工具:易用的命令行界面,用于代码生成 🎨 装饰器式 API:生成装饰器式的客户端类,实现清晰的 API 交互 📋 全面的模型:处理复杂的模式,包括联合、交集、枚举和引用 🚀 Fetcher 生态集成:无缝集成 Fetcher 生态系统包 📊 进度日志:生成过程中的友好日志记录和进度指示器 📁 自动索引生成:自动生成 index.ts 文件,实现清晰的模块组织 🌐 远程规范支持:直接从 HTTP/HTTPS URL 加载 OpenAPI 规范 🎭 事件流:生成常规和事件流命令客户端 📖 生成器使用示例 从本地 OpenAPI 规范生成代码 fetcher-generator generate -i ./api-spec.json -o ./src/generated 从远程规范生成代码 fetcher-generator generate -i https://api.example.com/openapi.json -o ./src/generated 生成的代码结构: output/ ├── {bounded-context}/ │ ├── index.ts # 自动生成的索引文件,导出所有聚合 │ ├── boundedContext.ts # 有界上下文别名常量 │ ├── types.ts # 有界上下文的共享类型 │ └── {aggregate}/ # 聚合特定文件 │ ├── index.ts # 聚合的自动生成索引文件 │ ├── types.ts # 聚合特定类型、模型和枚举 │ ├── queryClient.ts # 查询客户端工厂,用于状态和事件查询 │ └── commandClient.ts # 命令客户端类(常规和流式) ├── index.ts # 根索引文件,导出所有有界上下文 └── tsconfig.json # 生成代码的 TypeScript 配置 🔥OpenAPI 全面增强 全新 OpenAPI 包:独立的 OpenAPI 规范支持包 扩展支持:OpenAPI 规范接口现在支持扩展功能 类型优化:SchemaType 新增 'null' 类型支持,字段可选性优化 💪装饰器(Decorator)全面升级 生命周期钩子:为 API 服务添加完整的生命周期钩子支持 参数装饰器增强:支持对象展开功能,简化参数处理 元数据管理:新增 API 元数据和请求执行器能力 类型安全:端点返回类型能力增强,提升开发体验 🎯查询系统重大改进 泛型类型支持:Condition 接口和查询接口全面支持泛型类型参数 领域事件流增强:新增状态和操作符能力,支持更复杂的数据处理 类型安全查询:事件流查询的类型安全性大幅提升 🔧核心功能优化 TRACE 方法支持:HTTP TRACE 方法现在得到完整支持 命令系统增强:新增批处理结果接口和等待信号机制 类型定义完善:新增 MessageHeaderSqlType 枚举和 WowMetadata 接口 📚 文档与工具 🎨代码质量提升 统一代码风格:ESLint 和 Prettier 自动化代码格式化 测试优化:使用 MSW 替换模拟 fetch,提升测试可靠性 ⚡ 性能与稳定性 依赖更新:所有工作区依赖更新至最新版本 Docker 支持:Wow 示例服务器更新至 v6.1.12 MongoDB 支持:MongoDB 客户端更新至 v8.0.14 🎉 破坏性变更 移除过时功能:废弃的@attributes参数装饰器已被移除 类型重命名:PathParams重命名为UrlPathParams,提升语义清晰度 架构优化:查询客户端迁移至 fetcher-decorator,架构更加统一 🚀 开始使用 这次更新为 Fetcher 生态系统带来了前所未有的开发体验!无论是全新的代码生成器,还是全面增强的类型系统,都将显著提升您的开发效率。 立即升级到 v2.3.0,体验下一代 API 开发工具的强大功能! 🌟 为什么选择 Fetcher? Fetcher 不仅仅是一个 HTTP 客户端——它是一个为现代 Web 开发设计的完整生态系统,原生支持 LLM 流式 API。基于原生 Fetch API 构建,Fetcher 提供了类似 Axios 的体验,同时保持极小的体积。 🚀 核心特性 🎯@ahoo-wang/fetcher- 基础核心 轻量级核心,驱动整个生态系统: ⚡ 超轻量级: 仅 3KiB min+gzip - 比大多数替代品更小 🧭 路径和查询参数: 内置支持路径 ({id}/:id) 和查询参数 🔗 拦截器系统: 请求、响应和错误拦截器,支持有序执行的灵活中间件模式 ⏱️ 超时控制: 可配置的请求超时和适当的错误处理 🔄 Fetch API 兼容: 完全兼容原生 Fetch API 🛡️ TypeScript 支持: 完整的 TypeScript 定义,实现类型安全开发 🧩 模块化架构: 轻量级核心和可选扩展包 📦 命名 Fetcher 支持: 自动注册和检索 fetcher 实例 ⚙️ 默认 Fetcher: 预配置的默认 fetcher 实例,快速上手 🎨@ahoo-wang/fetcher-decorator- 声明式 API 使用简洁的声明式服务定义转换您的 API 交互: 🎨 清晰的 API 定义: 使用直观的装饰器定义 HTTP 服务 🧭 自动参数绑定: 路径、查询、头部和正文参数自动绑定 ⏱️ 可配置超时: 每方法和每类的超时设置 🔗 Fetcher 集成: 与 Fetcher 的命名 fetcher 系统无缝集成 ⚡ 自动实现: 方法自动实现 HTTP 调用 📦 元数据系统: 丰富的元数据支持,用于高级自定义 📡@ahoo-wang/fetcher-eventstream- 实时流和 LLM 支持 为您的实时应用提供 Server-Sent Events 支持,专为大型语言模型流式 API 设计: 📡 事件流转换:将text/event-stream响应转换为ServerSentEvent对象的异步生成器 🔌 自动扩展:模块导入时自动扩展Response原型,添加事件流方法 📋 SSE 解析:根据规范解析服务器发送事件,包括数据、事件、ID 和重试字段 🔄 流支持:正确处理分块数据和多行事件 💬 注释处理:正确忽略注释行(以:开头的行) 🛡️ TypeScript 支持:完整的 TypeScript 类型定义 ⚡ 性能优化:高效的解析和流处理,适用于高性能应用 🤖 LLM 流准备就绪: 原生支持来自流行 LLM API(如 OpenAI GPT、Claude 等)的流式响应 LLM 集成示例 LlmClient演示了如何创建具有流支持的 LLM API 专用客户端: import { createLlmFetcher, LlmClient } from './llmClient'; // 使用您的 API 配置初始化 LLM 客户端 const llmFetcher = createLlmFetcher({ baseURL: 'https://api.openai.com/v1', apiKey: process.env.OPENAI_API_KEY || 'your-api-key', model: 'gpt-3.5-turbo', }); const llmClient = new LlmClient(); // 流式聊天完成,逐个令牌输出 async function streamChatExample() { const stream = await llmClient.streamChat({ messages: [ { role: 'system', content: 'You are a helpful assistant.' }, { role: 'user', content: 'Explain quantum computing in simple terms.' }, ], stream: true, }); for await (const event of stream) { if (event.data) { const chunk = event.data; const content = chunk.choices[0]?.delta?.content || ''; process.stdout.write(content); // 实时输出 } } } 🔧@ahoo-wang/fetcher-generator- OpenAPI 代码生成器 从 OpenAPI 规范生成 TypeScript 代码,专为 WOW 领域驱动设计框架打造: 🎯 OpenAPI 3.0+ 支持:完整支持 OpenAPI 3.0+ 规范(JSON/YAML) 📦 TypeScript 代码生成:生成类型安全的 TypeScript 接口、枚举和类 🏗️ 领域驱动设计:专为 WOW 框架打造,支持聚合、命令、查询和领域事件 🔧 CLI 工具:易用的命令行界面,用于代码生成 🎨 装饰器式 API:生成装饰器式的客户端类,实现清晰的 API 交互 📋 全面的模型:处理复杂的模式,包括联合、交集、枚举和引用 🚀 Fetcher 生态集成:无缝集成 Fetcher 生态系统包 📊 进度日志:生成过程中的友好日志记录和进度指示器 📁 自动索引生成:自动生成 index.ts 文件,实现清晰的模块组织 🌐 远程规范支持:直接从 HTTP/HTTPS URL 加载 OpenAPI 规范 🎭 事件流:生成常规和事件流命令客户端 💾@ahoo-wang/fetcher-storage- 跨环境存储 轻量级跨环境存储库,具有变更事件监听功能: 🌐 跨环境支持:为浏览器 localStorage/sessionStorage 和内存存储提供一致的 API 📦 超轻量级:仅 ~1KB gzip - 最小化占用空间 🔔 存储变更事件:通过事件驱动架构监听存储变更 🔄 自动环境检测:自动选择合适的存储实现 🛠️ 基于键的存储:高效的基于键的存储,内置缓存 🔧 自定义序列化:支持自定义序列化策略 📝 TypeScript 支持:完整的 TypeScript 定义,实现类型安全的存储操作 🧩@ahoo-wang/fetcher-wow- CQRS/DDD 框架支持 与WowCQRS/DDD 框架的一流集成: 📦 完整的 TypeScript 支持:为所有 Wow 框架实体提供完整的类型定义,包括命令、事件和查询 🚀 命令客户端:用于向 Wow 服务发送命令的高级客户端,支持同步和流式响应 🔍 强大的查询 DSL:丰富的查询条件构建器,支持全面的操作符用于复杂查询 📡 实时事件流:内置对服务器发送事件的支持,用于接收实时命令结果和数据更新 🔄 CQRS 模式实现:对命令查询责任分离架构模式的一流支持 🧱 DDD 基础构件:基本的领域驱动设计构建块,包括聚合、事件和值对象 🔍 查询客户端:专门用于查询快照和事件流数据的客户端,支持全面的查询操作: 资源计数 资源列表查询 以服务器发送事件形式流式传输资源 资源分页 单个资源检索 🔐@ahoo-wang/fetcher-cosec- 企业安全 使用集成认证保护您的应用: 🔐 自动认证: 自动 CoSec 认证头部 📱 设备管理: 使用 localStorage 持久化的设备 ID 管理 🔄 令牌刷新: 基于响应代码 (401) 的自动令牌刷新 🌈 请求跟踪: 用于跟踪的唯一请求 ID 生成 💾 令牌存储: 安全的令牌存储管理 📦 包生态系统 包 描述 版本 大小 @ahoo-wang/fetcher 核心 HTTP 客户端 具有 Axios 类似 API 的超轻量级基础 @ahoo-wang/fetcher-decorator 装饰器支持 声明式 API 服务定义 @ahoo-wang/fetcher-eventstream 实时流和 LLM 支持 Server-Sent Events (SSE) 支持,原生 LLM 流式 API 集成 @ahoo-wang/fetcher-generator OpenAPI 代码生成器 从 OpenAPI 规范生成 TypeScript 代码,专为 WOW 领域驱动设计框架打造 @ahoo-wang/fetcher-openapi OpenAPI TypeScript 类型 OpenAPI 3.0+ 规范的完整 TypeScript 类型定义 @ahoo-wang/fetcher-storage 跨环境存储 轻量级存储库,具有浏览器和 Node.js 的变更事件监听功能 @ahoo-wang/fetcher-react React 集成 React hooks 和组件,实现无缝数据获取和自动重新渲染 @ahoo-wang/fetcher-wow CQRS/DDD 框架支持 与 Wow CQRS/DDD 框架的一流集成 @ahoo-wang/fetcher-cosec 企业安全 CoSec 认证集成 🚀 快速开始 📦 安装 # 安装核心包 npm install @ahoo-wang/fetcher # 或安装所有扩展,包括 LLM 流支持 npm install @ahoo-wang/fetcher @ahoo-wang/fetcher-decorator @ahoo-wang/fetcher-eventstream @ahoo-wang/fetcher-cosec # 使用 pnpm (推荐) pnpm add @ahoo-wang/fetcher # 使用 yarn yarn add @ahoo-wang/fetcher ⚡ 快速示例 基础 HTTP 客户端 import { Fetcher } from '@ahoo-wang/fetcher'; // 创建 fetcher 实例 const fetcher = new Fetcher({ baseURL: 'https://api.example.com', timeout: 5000, }); // 带路径和查询参数的 GET 请求 const response = await fetcher.get('/users/{id}', { urlParams: { path: { id: 123 }, query: { include: 'profile' }, }, }); const userData = await response.json<User>(); // 自动 JSON 转换的 POST 请求 const createUserResponse = await fetcher.post('/users', { body: { name: 'John Doe', email: 'john@example.com' }, }); 声明式 API 服务 import { NamedFetcher } from '@ahoo-wang/fetcher'; import { api, get, post, path, query, body, } from '@ahoo-wang/fetcher-decorator'; // 注册命名 fetcher const apiFetcher = new NamedFetcher('api', { baseURL: 'https://api.example.com', }); // 使用装饰器定义服务 @api('/users', { fetcher: 'api' }) class UserService { @get('/') getUsers(@query('limit') limit?: number): Promise<User[]> { throw autoGeneratedError(limit); } @post('/') createUser(@body() user: User): Promise<User> { throw autoGeneratedError(user); } @get('/{id}') getUser(@path('id') id: number): Promise<User> { throw autoGeneratedError(id); } } // 使用服务 const userService = new UserService(); const users = await userService.getUsers(10); 强大的拦截器 import { Fetcher } from '@ahoo-wang/fetcher'; const fetcher = new Fetcher({ baseURL: 'https://api.example.com' }); // 添加带排序的请求拦截器 fetcher.interceptors.request.use({ name: 'auth-interceptor', order: 100, intercept(exchange) { exchange.request.headers.Authorization = 'Bearer ' + getAuthToken(); }, }); // 添加响应拦截器用于日志记录 fetcher.interceptors.response.use({ name: 'logging-interceptor', order: 10, intercept(exchange) { console.log('Response:', exchange.response.status); }, }); 实时流和 LLM 支持 import { Fetcher } from '@ahoo-wang/fetcher'; import { EventStreamInterceptor } from '@ahoo-wang/fetcher-eventstream'; const fetcher = new Fetcher({ baseURL: 'https://api.example.com' }); fetcher.interceptors.response.use(new EventStreamInterceptor()); // 流式实时事件 (通用 SSE) const response = await fetcher.get('/events'); if (response.eventStream) { for await (const event of response.eventStream()) { console.log('Real-time event:', event); } } // 流式 LLM 响应,逐个令牌输出 const llmResponse = await fetcher.post('/chat/completions', { body: { model: 'gpt-3.5-turbo', messages: [{ role: 'user', content: 'Hello!' }], stream: true, }, }); if (llmResponse.jsonEventStream) { // 专门用于 LLM API 的 JSON SSE 事件 for await (const event of llmResponse.jsonEventStream<ChatCompletionChunk>()) { const content = event.data.choices[0]?.delta?.content || ''; process.stdout.write(content); // 实时令牌输出 } } 🎯 集成测试示例 在我们的integration-test目录中探索全面、可用于生产的实现: 🌐 HTTP 操作 Typicode API 集成- 与 JSONPlaceholder API 的完整集成,演示实际使用 参数处理- 高级路径、查询和正文参数管理 错误处理- 全面的错误处理模式 🔧 高级模式 COSEC 认证- 具有令牌管理的企业级安全集成 拦截器链- 具有有序执行的复杂中间件模式 超时策略- 自适应超时配置 📡 实时特性 LLM 流式 API- 原生支持从大型语言模型流式响应 Server-Sent Events- 实时通知和更新 流数据- 具有自动重新连接的连续数据流 🎨 装饰器模式 声明式服务- 使用 TypeScript 装饰器的清晰、可维护的 API 服务层 元数据扩展- 用于高级用例的自定义元数据 类型安全 API- 完整的 TypeScript 集成和自动类型推断 🏗️ 开发和贡献 🛠️ 先决条件 Node.js >= 16 pnpm >= 8 🚀 开发命令 # 安装依赖 pnpm install # 构建所有包 pnpm build # 运行单元测试和覆盖率 pnpm test:unit # 格式化代码 pnpm format # 清理构建产物 pnpm clean # 运行集成测试 #pnpm test:it 📦 版本管理 同时更新所有包: pnpm update-version <new-version> 这会更新单体仓库中所有package.json文件的版本字段。 🤝 贡献 欢迎贡献!请查看我们的贡献指南获取详情: Fork 仓库 创建您的功能分支 (git checkout -b feature/AmazingFeature) 提交您的更改 (git commit -m 'Add some AmazingFeature') 推送到分支 (git push origin feature/AmazingFeature) 打开拉取请求 🧪 质量保证 代码覆盖率: 所有包保持在 95% 以上 TypeScript: 启用严格类型检查 代码检查: 使用 Prettier 的 ESLint 保证一致的代码风格 测试: 全面的单元和集成测试

优秀的个人博客,低调大师

Pyodide —— 在浏览器端实现 Python 全栈科学计算

Pyodide 由编译成 WebAssembly 的 CPython 3.8 解释器组成,允许 Python 在网页浏览器中运行。 Pyodide 可以安装来自 PyPi 的任何 Python 包。Pyodide 还包括一个外部函数接口,可以将 Python 包暴露给 JavaScript,并将浏览器 UI,包括 DOM,暴露给 Python。该项目还使许多 Python 科学包,包括 NumPy、Pandas、Matplotlib、SciPy 和 Scikit-learn,就可以在浏览器中运行。

优秀的个人博客,低调大师

Python全栈 Web(jQuery 一条龙服务)

jQuery 1.jQuery介绍 jQuery是一个轻量级的JS库 - 是一个被封装好的JS文件,提供了更为简便的元素操作方式 核心理念:Write Less Do More jQuery版本: jQuery 2.x 不再支持IE6.7.8 jQuery 1.11.x 2.使用jQuery 1.引入jQuery文件 <script src="jquery-1.11.3.js"></script> 注意:jQuery文件的引入操作必须要放在其他jQuery操作之前 3.jQuery对象 1.什么是jQuery对象 jQuery对象是由jQuery对页面元素进行封装后的一种体现 jQuery中所提供的所有的操作都只针对jQuery对象,DOM对象不能用 2.工厂函数 - $() 作用: 1.能够获取 jquery对象 2.能够将DOM对象转

优秀的个人博客,低调大师

Python全栈 MySQL 数据库 (SQL查询、备份、恢复、授权)

ParisGabriel 每天坚持手写一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 今天接着昨天的说 索引有4种: 普通 索引 : index 唯一索引: unique 主键索引: primary key 外键索引: foreign key 索引查询命令: show index from 表名\G; Non_Unique:1 :index Non_Unique:0 :unique 外键索引(foreign key): 定义:让当前字段的值 在另一个表的范围 内选择 语法: foreign key(参考字段名) references 主表(被参考字段名) on delete 级联动作 on update 级联动作 使用规则: 主表、 从表字段 数据类型要一致 主表 被参考字段一般是: 主键 删除外键: alter table 表名 drop foreign key 外键名; 外键名查询:show create table 表名; 级联动作: cascade 级联 删除、更新(只限于参考字段) restrict(默认) 从表有相关 记录, 不允许主表操作 set NULL 主表删除、更新, 从表关联记录 字段值为NULL 已有表添加外键: alter table 表名 add foreign key(参考字段)reference主表(被参考字段) on delete ... on update ... 表的复制 复制表: create table 表名 select... from where 表名; 表结构: create table 表名 select * from 表名 where false; 注意: 复制表的时候 不会把原表的 键(key)属性复制过来 SQL 查询(高级) 嵌套查询(子查询): 定义: 把内层 查询结果作为外层的 查询条件 语法格式: select ...from 表名 where 条件(select...); 多表查询: 两种方式 1. select 字段名列表 from 表名列表;(笛卡尔积) select * from t1,t2 select t1.name,t2.name from t1,t2; 2. select t1.name,t2.name from t1,t2 where 条件 链接查询: 1.内链接 select 字段名 from 表1 inner join 表2 on 条件 inner join 表3 on 条件...; 2.外链接 1.左链接 以左表为主显示查询结果 select 字段名 from 表1 left join 表2 on 条件 left join 表3 on 条件...; 2.右链接 以右表为主显示查询结果 select字段名 from 表1 right join 表2 on 条件 right join 表3 on 条件...; 数据备份: mysqldump 在Linux终端操作 完全备份: mysqldump -u用户 -p源库名 > ~/xxx.sql --all-databases 备份所有库 库名 备份单个库 -B 库1 库2.. 备份多个库 库名 表1 表2... 备份指定库指定表 数据恢复: 恢复单个库 mysql -uroot -p < 目标库名 xxx.sql 从所有库备份中恢复某一个库(-one-database) mysql -uroot -p --one-database 目标库名 < xxx.sql 注意: 1. 恢复库 时如果 恢复到原库会将 表中的 数据覆盖, 新增表不会删除 2.数据恢复时 如果恢复的 库不存在,则 必须先创建空库 MySQL的账户管理: 1.开启mysql的远程连接 sudo -i cd /etc/mysql/mysql.conf.d/ subl mysql.cnf #bind-address = 127.0.0.1 注释掉 /etc/init.d/mysql restart 2.添加授权用户 用root用户登录mysql mysql -uroot -p123456 授权: grant 授权列表 on 库.表 to “用户名“@”%” identified by “密码” with grant option 权限列表: all privileges、select、insert 库.表: *.* 所有库所有表 示例: 1、添加授权用户tiger,密码123,对所有库的所有表有所有权限 grant all privileges on *.* to "tiger"@"%" identified by "123" with grant option;

优秀的个人博客,低调大师

Python全栈 MySQL 数据库 (简述 、安装、基本命令)

ParisGabriel 每天坚持手写一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 一个月的python已经结束了 下面就是数据库了 先说MySQL 这个数据库应该差不多是用户量最多的了 MySQL概述:1.什么是数据库: 存储数据的厂库2.有哪些公司在用数据库 金融机构、游戏网站、购物网站、论坛网站...3.提供数据库服务的软件: 1.软件的分类: MySQL、Oracle、SQL_Server、DB2、MongoDB、MariaDB 2.生产环境中,如何选择使用哪些数据库软件: 1.是否开源 1.开源软件:MySQL、Mariadb、MongoDB 2.商业软件:Oracle、DB2、SQL_Server 2.是否跨平台 1.不过平台:SQL_Server 2.跨平台:...... 3.公司的类型: 商业软件:政府部门、金融机构 开源软件:游戏网站、购物网站、论坛网址站 4.MySQL的特点: 1.关系型数据库 1.关系型数据库的特点 1.数据是以行和列(表格)的形式存储的 2.表格到的每一行是一条记录 ,没一列叫一个字段 3.表与表之间的逻辑关联叫关系 2.示例: 1.关系型数据库: 表1 学生信息表 姓名 年龄 班级 张三 25 三班 李四 25 六班 表2 班级信息表 班级 班主任 三班 大空翼 六班 松人 寻找张三的班主任是谁 通过两张表的关联关系能查询出来(查询功能强大) 2.非关系型数据库 {”姓名“:“张三”, ”年龄“:25, “班主任”} 以字典的形式存储 键值对形式纯在的 如果没有则则无法找到 (查询速度快) 2. 跨平台: 可以在Windows、Unix、Linux、上运行数据库服务 3. 支持多种编程语言 Python、Java、PHP.... 5.数据库软件、数据库、数据厂库的概念 1.数据库软件: 就是一个软件,看的见、可操作、是现实数据的逻辑功能 2.数据库: 是一种逻辑概念,用来存放数据的厂库,侧重于存储 3.数据厂库 从数据量来说,比数据库庞大的多,主要用于数据分析和数据挖掘 那个时间段用户登录最多,那个用户一年购物最多 MySQL的安装 1.Ubuntu安装MySQL服务 1.安装服务端 sudo apt-get install mysql-server apt-get系统自带到的安装服务 2.安装客户端 sudo apt-get install mysql-client 3.Ubuntu安装软件: 1.sudo apt-get update 访问源列表中的每个网址,读取软件列表,保存到本地 /var/lib/apt/lists 2.sudo apt-get upgrade 把本地已安装的软件与刚下的列表进行对比 如果发现已安装的软件版本低 则全部更新 3.sudo apt-get -f install 修复依赖关系 2.启动和链接MySQL服务 1.服务端启动 1.查看状态 sudo /etc/init.d/mysql status (查询) 2.启动 sudo /etc/init.d/mysql start (启动) sudo /etc/init.d/mysql stop (停止) sudo /etc/init.d/mysql restart(重启) sudo /etc/init.d/mysql reload(重新加载配置文件) 2.客户端链接 1.命令格式 mysql -h主机地址 -u用户名 -p密码 mysql -hlocalhost -uroot -p123456SQL命令的使用规则: 1.没填命令必须以 ; 结尾 2.SQL不区分大小写 3.使用\c 来终止当前命令执行2.库的管理: 1.库的基本操作 1.查看已有的库 show databases; 2.创建库 create database 库名; create database 库名 character set utf8;(字符编码) 3.查看创建库的语句(字符集) show create database 库名; 4.查看当前所在的库: select database(): 5.切换库 use 库名; 6.查看库中已有的表 show tables; 7.删除库 drop database 库名; 库名的命名规则: 1.数字、字母、下划线,但是不能使用纯数字 2.库的名字区分大小写 3.不能使用特殊字符和MySQL关键字 3. 表的管理2.表的基本操作 1.查看表 show tables 2.创建表 create table 表名( 字段名 数据类型, 字段名 数据类型, ....... ); 3.查看已有表的字符集 show create table 表名; 4.查看表结构 desc 表名; 5.删除表 drop table 表名;3.注意: 1.所有的数据都是以文件的形式存放在数据库根目录下 2.数据目录:/var/lib/mysql 4.mac安装mysql 1.cd 2.vi.bash_profile 添加:PATH=“$PATH”:/usr/local/myswl/bin 3.source .bash_profile5.表记录管理 1.插入(insert) 1.insert into 表名 values(值1),(值2).....; 2.insert into 表名(字段1,.....)values(值1),....; 2.查询(select) select * from 表名 [where 条件] 查询所有字段; select 字段名1,字段名2,... form 表名 [where 条件]; 6.如何更改默认字符集 1.方法(通过更改mysql配置文件实现) 2.步骤 1.获取root权限 sudo -i 2.cd /etc/mysql/mysql.conf.d/ 3.备份:cp mysql.cnf mysqld.cnf.bak 4.subl mysqld.cnf [mysqld] character_set_server = utf8 5.重启mysql服务 /etc/init.d/mysql7. 客户端把数据存储到数据库服务器上的过程 1.链接到数据库服务器 mysql -uroot -p123456 2.选择一个库 use 库名 3.创建表/修改表 update 表名... 4.断开与数据数据库链接 exit;| quit; | \q8.数据类型 1.数字类型 1.整型 1.int 大整型(4个字节) 取值范围:2**32 - 1(4294967295) 2.tinyint 微小整型(一个字节) 1.有符号(signed默认):-128 ~ 127 2.无符号(unsigned):0 ~ 255 3.smallint 小整型(2字节) 4.bigint 极大整型(8字节) 2.浮点型 1.float(4个字节,最多显示7个有效位) 1.用法: 字段名 float(m,n) m:总位数 n:小数位数 float(5,2)取值范围? -999.99 ~ 999.99 2.decimal(最多显示28个有效位) decimal(m,n) 存储空间(整数、小数分开存储) 规则:将9的倍数包装成4个字节 余数 字节 0 0 1-2 1 3-4 2 5-6 3 7-9 4 示例decimal(19,9) 整数部分: 10/9 = 1 % 1 4字节+1字节=5字节 小数部分: 9/9 = 1 % 0 4字节+0字节=4字节 共占:9字节 2.字符类型 1.char(定长) 1.取值范围:1~255 2.varcahr(变长) 1.取值范围:1~65535 3.text / longtext(存储范围:4G)/blob /longblob(4G)char和varchar的特点: 1.cahr:浪费储存空间,性能高 2.varchar:节省储存空间,性能低 3、练习 1、创建库testdb,指定字符集为 utf8 2、进入到库 testdb 3、查看当前所在库 4、创建库 testdb2,指定字符集为 latin1 5、进入到库 testdb2 6、查看 testdb2 的字符集(查看创建库的语句) 7、删除库 testdb 8、删除库 testdb2答案: create database testdb character set utf8; use testdb; select database(); create database testdb2 character set latin1; use testdb2; show create database testdb2; drop database testdb; drop database testdb2; 2、练习 1、创建库python1 2、在python1库中创建表 pymysql并指定字符集为utf8,字段有三个:id 、name char(15) 、 age 3、查看创建表pymysql的语句 4、查看pymysql的表结构 5、删除表pymysql 6、创建库python2 7、在python2中创建表t1并指定字符集为utf8,字段有 id 、name 、score,数据类型自己定义 8、查看t1的表结构 9、删除表t1 10、删除库 python2 答案: create database python1; use python1; create table pymysql( id int, name char(15), age int ) character set utf8; show create table pymysql; desc pymysql; drop table pymysql; create database python2; use python2; create table t1( id int, name char(15), score float(5,2) ) character set utf8; desc t1; drop table t1; drop database python2; 3、练习 1、查看所有的库 2、创建新库 studb 3、在 studb 中创建表 tab1 ,指定字符集utf8,字段有 id 、name、age 4、查看tab1的表结构 5、在tab1中随便插入2条记录 6、在tab1中的name、age两个字段插入2条记录 7、查看tab1中所有记录 8、查看tab1表中所有人的姓名和年龄 9、查看tab1表中年龄大于20的信息答案: show databases; create database studb; use studb; create table tab1( id int, name char(10), age int )character set utf8; desc tab1; insert into tab1 values (1,"张三丰",100),(2,"张无忌",30); insert into tab1(name,age) values ("金毛狮王",88),("紫衫龙王",87); select * from tab1; select name,age from tab1; select * from tab1 where age>20; 3、练习 1、创建库 studb2 ,并在库中创建表 stuinfo,要求: id :大整型 name :字符类型,宽度为15 age :微小整型,不能为负数 height :浮点型,小数位为2位(float) money :浮点型,小数位为2位(decimal) 2、查看stuinfo的表结构 3、查看stuinfo的默认字符集 4、在表中插入1条完整记录 5、查询所有表记录 6、在表中id 、name两个字段插入2条记录 7、查询所有学生的id和姓名答案: create table stuinfo( id int, name char(15), age tinyint unsigned, height float(5,2), money decimal(20,2) ); desc stuinfo; insert into stuinfo values (1,"Bob",23,176,88888.88); select * from stuinfo; insert into stuinfo(id,name) values (2,"Jim"),(3,"Tom"); select id,name from stuinfo; 8、作业1、MySQL中数据类型有:____ ____ 枚举类型 日期时间类型 整数型、字符型2、关系型数据库中的核心内容是 ___ 即 二维表 关系3、简述客户端把数据存储到数据库服务器上的过程 链接数据库 切换的相应的库 找到相应的表格进行操作 断开数据库链接4、char和varchar的区别,各自的特点 char:浪费储存空间 但性能高 varcchar:节省存储空间 但性能低5、操作 1、创建一个学校的库 school 2、在库中创建表 students 用来存储学生信息: id 大整型 姓名、年龄(不能为负)、性别、成绩(浮点) 3、查看students的表结构 4、在表中随意插入3条记录 5、在表中的 姓名、成绩两个字段插入3条记录 6、查看所有学生的姓名和成绩 8、查看成绩及格(>60分)的学生的姓名和成绩 答案: create database school; use school; create table students( id int, name char(15), age tinyint unsigned, gender char(2), score float(5,2) ); desc students; insert into students values (1,"张三",20,"男",95.56), (2,"李四",21,"男",98.30), (3,"王浅",21,"女",100); insert into students (name,score) values ("tom",60), ("lili",56), ("zhao",58.56); select name,score from sutdents; select name,score from students where score>=60;

优秀的个人博客,低调大师

Python全栈工程师(异常(高级)、运算符重载)

ParisGabriel 每天坚持手写一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 对象的属性管理函数: getattr(obj, name[,default) 从对象得到对象的属性,getattr(x, “y”) 等同于x, y 当属性 不存在时 如果给出default参数则返回default 如果没有给出default ,则产生一个AttributeError错误 hasattr(obj, name)用给定的name返回对象obj是否有此属性 此种做法可以避免在getattr(obj,name)时引发错误 setattr(obj, name, value) 给对象obj的名为name的 属性设置相应的值value, set(x, 'y', v) 等同于 x.y = v delattr(obj, name) 删除对象obj中的name属性 , delattr(x, 'y') 等同于 del x.y 示例: class Dog: pass d = Dog() d.color = "白色" v = getattr(d, "color") # 等同于 v = d.color v = getattr(d, "kinds") # 出错,没有d.kinds属性 v = getattr(d, "kinds", "没有这个属性") # v= '没有这个属性' hasattr(d, 'color') # True hasattr(d, 'kinds') # False setattr(d, 'kinds', '京巴') # 等同于d.kinds ='京巴' hasattr(d, 'kinds') # True delattr(d, 'kinds') # 等同于 del d.kinds hasattr(d, 'kinds') # False 异常(高级): 可以用于异常的语句 try-except # 捕获异常,得到通知 try-finally # 左任何流程(正常/异常)都必须执行要执行的语句 raise # 发送异常 assert # 根据条件发送异常通知with 语句: 语法: with 表达式1[as 变量1], 表达式2[as 变量2].... 作用: 使用与对资源进行访问的场合,确保使用过程中不管 是否发生异常都会执行必要的“清理操作”,并释放资源 (如: 文件使用后自动关闭,线程中锁的自动获取和释放等) 说明: 执行表达式,as子句中的变量绑定生成的对象 with语句并不改变异常的状态示例: # with语句打开文件和自动关闭 try: with open("a.txt") as f: for x in f: print(x) int("abc") # 出现异常 except OSError: print("文件打开失败") except ValueError: print("文件操作过程中错误") # try-finally语句打开文件和关闭 try: f = open("a.txt") for x in f: print(x) except OSError: print("打开文件失败") except ValueError: print("文件操作过程中错误") finally: f.close() # 修改原来的copy文件功能 src_filename = input("请输入源文件路径名: ") dst_filename = input('请输入目标文件路径名: ') try: with open(src_filename, 'rb') as src,\ open(dst_filename, 'wb') as dst: # 打开源文件用来读数据 while True: b = src.read(4096) if not b: # 已经再也读不到数据了 break dst.write(b) print("复制成功") except OSError: print("复制失败") 环境管理器: 类内有__enter__和__exit__实例方法的类被称为环境管理器 能够用with进行管理的对象必须是环境管理器 说明: __enter__将在进入with语句时被调用并返回由as变量绑定的对象 __exit__将在离开with语句时被调用,且可以用参数来判断在 离开with语句时是否有异常发生并作出相应的处理示例: # 一个自定义的类创建的对象能够使用with语句 class A: '''此类的对象可用于with语句进行管理''' def __enter__(self): print("已经进入with语句中,资源分配成功") return self # <<<-- 此处返回的对象将由as变量绑定 def __exit__(self, exc_type, exc_val, exc_tb): print("离开with语句,资源释放成功") if exc_type is None: print("当离开with语句时没有异常") else: print("有异常发生 异常类型:",exc_type , "异常值:", exc_val) with A() as a: print("这是with语句中的语句") raise ValueError("故意制造的异常") 运算符重载: 什么是运算符重载 让自定义的类生成的对象(实例)能够使用运算符进行操作 作用: 1.让自定义的类的实例能够运行运算符操作 2.让程序简洁易读 3.对定义对象将运算符赋予新的运算规则 说明: 运算符重载方法的参数已经有固定含义,不建议改变原有的含义 算数运算符重载: 方法名 运算符和表达式 说明__add__(self, rhs) self + rsh 加法__sub__(self, rhs) self - rsh 减法__mul__(self, rhs) self * rsh 乘法__truediv__(self, rhs) self / rsh 除法__floordiv__(self, rhs) self // rsh 地板除__mod__(self, rhs) self % rsh 求模__pow__(self, rhs) self ** rsh 幂 rhs(self hand side) 右手边 示例: class MyNumber: def __init__(self, val): self.data = val def __repr__(self): return "%d" % self.data def __add__(self, rsh): v = self.data + rsh.data return MyNumber(v) def __sub__(self, rsh): return MyNumber(self.data - rsh.data) n1 = MyNumber(100) n2 = MyNumber(200) n3 = n1 + n2 # 等同于 n3 = n1.__add__(n2) # n3 = n1.__add__(n2) print(t(n1, "-", n2, "=", n1 - n2) 反向算术运算符的重载 当运算符的左侧为内建类型,右侧为自义类型的对象进行算术运算符运算时,会出现TypeError错误, 因无法修改内建类的代码来实现运算符重载,此时需要使用反向算术运算符重载 反向算术运算符重载 方法名 运算符和表达式 说明__radd__(self, lhs) lhs + self 加法__rsub__(self, lhs) lhs - self 减法__rmul__(self, lhs) lhs * self 乘法__rtruediv__(self, lhs) lhs / self 除法__rfloordiv__(self, lhs) lhs // self 地板除__rmod__(self, lhs) lhs % self 取模(求余)__rpow__(self, lhs) lhs ** self 幂 lhs(left hand side) 右手边 示例: # 此示例示意返向算述运算符的重载 class MyList: def __init__(self, lst=[]): '''在初始化方法内为每个对象都创建一个bata属性 bata 用来绑定每个对象自己的列表 ''' self.beta = [x for x in lst] # self.bata = list(lst) def __repr__(self): return "%s" % self.beta def __mul__(self, rhs): return MyList(self.beta * rhs) print("__mul__ 被到调用") def __rmul__(self, lhs): print("__rmul__ 被到调用") return MyList(self.beta * lhs) # 反向传参 L1 = MyList([1, 2, 3]) L2 = MyList(range(4, 7)) L3 = 2 * L1 # L1.__rmul__(2) print(L3) L5 = L1 * 2 # L5 = L1.__mul__(2) print(L5) # MyList([1, 2, 3, 1, 2, 3]) 复合赋值算术运算符的重载 以复合赋值算术运算符 x += y 为例,此运算会优先调用x.__iadd__(y) 方法, 如果没有__iadd__方法时会将复合赋值运算拆解为 x = x + y,然后调用x = x.__add__(y) 方法 如果再不存在 __add__方法则会触发TypeError异常 其它复合赋值运算符也具有相同的规则 复合赋值算术运算符重载 方法名 运算符和表达式 说明__iadd__(self, lhs) lhs += self 加法__isub__(self, lhs) lhs -= self 减法__imul__(self, lhs) lhs *= self 乘法__itruediv__(self,lhs) lhs /= self 除法__ifloordiv__(self, lhs) lhs //= self 地板除__imod__(self, lhs) lhs %= self 取模(求余)__ipow__(self, lhs) lhs **= self 幂 示例: class MyList: def __init__(self, lst=[]): '''在初始化方法内为每个对象都创建一个bata属性 bata 用来绑定每个对象自己的列表 ''' # self.beta = [x for x in lst] self.bata = list(lst) def __repr__(self): return "%s" % self.beta def __iadd__(self, rhs): self.beta += rhs.beta # id不变 return self def __add__(self, rhs): return MyList(self.beta + rhs.beta) # id会不变 L = MyList([1, 2, 3]) def f1(lst): lst += MyList([4, 5, 6]) f1(L) print(L) 复合赋值算术运算符重载 方法名 运算符和表达式 说明__lt__(self, rhs) self < rhs 小于__le__(self, rhs) self <= rhs 小于等于__gt__(self, rhs) self > rhs 大于__ge__(self, rhs) self >= rhs 大于等于__eq__(self, rhs) self == rhs 等于__ne__(self, rhs) self != rhs 不等于示例: # 此示例示意比较运算符的重载 class MyList: def __init__(self, iterable): self.data = list(iterable) def __repr__(self): return 'MyList(%s)' % self.data def __eq__(self, rhs): return self.data == rhs.data def __gt__(self, rhs): return self.data > rhs.data L1 = MyList([1, 2, 3]) L2 = MyList([1, 2, 3]) print(L1 == L2) # True print(L1 > L2) # False # print(L1 == L2) # 如果没有__eq__ 方法判断两个对象的id # print(L1 > L2) # 如果没有__gt__ 方法报错 位运算符重载 方法名 运算符和表达式 说明 __invert__(self) ~ self 取反(一元运算符) __and__(self, rhs) self & rhs 位与 __or__(self, rhs) self | rhs 位或 __xor__(self, rhs) self ^ rhs 位异或 __lshift__(self, rhs) self << rhs 左移 __rshift__(self, rhs) self >> rhs 右移 反向位运算符重载 方法名 运算符和表达式 说明 __rand__(self, lhs) lhs & self 位与 __ror__(self, lhs) lhs | self 位或 __rxor__(self, lhs) lhs ^ self 位异或 __rlshift__(self, lhs) lhs << self 左移 __rrshift__(self, lhs) lhs >> self 右移 复合赋值位运算符重载 方法名 运算符和表达式 说明 __iand__(self, rhs) self &= rhs 位与 __ior__(self, rhs) self |= rhs 位或 __ixor__(self, rhs) self ^= rhs 位异或 __ilshift__(self, rhs) self <<= rhs 左移 __irshift__(self, rhs) self >>= rhs 右移 一元运算符重载 方法名 运算符和表达式 说明 __invert__(self) ~ self 取反(一元运算符) __pos__(self) + self 正号 __neg__(self) - self 负号 语法: def __xxx__(self): 示例: # 此示例示意一元运算符的重载 class MyList: def __init__(self, lst=[]): '''在初始化方法内为每个对象都创建一个bata属性 bata 用来绑定每个对象自己的列表 ''' self.beta = [x for x in lst] # self.bata = list(lst) def __repr__(self): return "%s" % self.beta def __neg__(self): return MyList((-x for x in self.beta)) def __pos__(self): return MyList((abs(x) for x in self.beta)) # L = [] # for x in self.beta: # if x > 0: # L.append(x) # else: # L.append(-x) # return MyList(L) L1 = MyList([1, -2, 3, -4, 5]) L2 = -L1 print(L2) # MyList([-1, 2, -3, 4, -5]) # 实现用正号运算符返回全部元素为正数的自定义列表 L3 = + L1 print(L3) # MyList([1, 2, 3, 4, 5]) in / not in 运算符重载重载方法:def __contains__(self, e):....示例: # in not in 重载 class MyList: def __init__(self, lst=[]): '''在初始化方法内为每个对象都创建一个bata属性 bata 用来绑定每个对象自己的列表 ''' self.beta = [x for x in lst] # self.bata = list(lst) def __repr__(self): return "%s" % self.beta def __contains__(self, e): return e in self.beta L1 = MyList([1, 2, -3, 4, -5]) print(2 in L1) print(3 in L1) print(4 in L1) print(5 in L1) 索引和切片运算符的重载 方法名 运算符和表达式 说明 __getitem__(self, i) x = self[i] 索引/切片取值 __setitem__(self, i, val) self[i] = val 索引/切片赋值 __delitem__(self, i) del self[i] 删除索引/切片 作用:让自定义的类的对象能够支持索引和切片操作示例: # 此示例示意 索引/切片 运算符的重载 class MyList: def __init__(self, iterable): self.data = list(iterable) def __repr__(self): return 'MyList(%s)' % self.data def __getitem__(self, i): print("索引i的值是:", i) return self.data[i] def __setitem__(self, i, v): print("__setitem__被调用, i=", i, 'v=', v) self.data[i] = v def __delitem__(self, i): del self.data[i] L1 = MyList([1, -2, 3, -4, 5]) v = L1[2] # v = 3 print(v) # 3 L1[1] = 2 print(L1) # MyList([1, 2, 3, -4, 5]) del L1[3] print(L1) # MyList([1, 2, 3, 5]) slice 函数: 作用: 用于创建一个slice切片对象,此对象存储切片的信息 格式: slice(start=None, stop=None, step=None) slice对象的属性 s.start 切片的起始值, 默认为None s.stop 切片的终止值, 默认为None s.step 切片的步长, 默认为None示例: # 此示例示意 索引/切片 运算符的重载 class MyList: def __init__(self, iterable): self.data = list(iterable) def __repr__(self): return 'MyList(%s)' % self.data def __getitem__(self, i): print("索引i的值是:", i) if type(i) is int: print("正在进行索引操作") elif type(i) is slice: print("正在进行切片操作") print("起始值是:", i.start) print("终止值是:", i.stop) print("步长值是:", i.step) return self.data[i] def __setitem__(self, i, v): print("__setitem__被调用, i=", i, 'v=', v) self.data[i] = v def __delitem__(self, i): del self.data[i] L1 = MyList([1, -2, 3, -4, 5]) L2 = L1[::2] print(L2) 特性属性 @property 实现其它语言所拥有的 getter 和 setter 的功能 作用: 用来模拟一个属性 通过@property 装饰器可以对模拟属性的取值和赋值加以控制 示例见: 示例: class Student: def __init__(self, s): self.__score = s # 私有属性,不让其它人任意修改成绩 @property def score(self): '''伪装模拟私有一个成绩属性 并返回成绩''' return self.__score @score.setter def score(self, v): '''实现设置者setter , 对用户的复制加以限制''' assert 0 <= v <= 100, "成绩不合法" self.__score = v s = Student(59) print(s.score) # 希望有一个属性能得到成绩 虚拟属性不能复制 s.score = 80 # 通过s.score 来修改成绩 print(s.score) # 修改成功 s.score看似属性 是模拟属性 实际内部已经被替换 问题: L = [1, 2, 3] def f1(lst): lst += [4, 5, 6] f1(L) print(L) # [1, 2, 3, 4, 5, 6] 为什么 L = (1, 2, 3) def f1(lst): lst += (4, 5, 6) # lst = lst + (4, 5, 6) f1(L) print(L) # (1, 2, 3) 为什么 练习: 1. 实现两个自定义的列表相加 class MyList: .... 此处自己实现 L1 = MyList([1, 2, 3]) L2 = MyList(range(4, 7)) L3 = L1 + L2 print(L3) # MyList([1, 2, 3, 4, 5, 6]) L4 = L2 + L1 print(L4) # MyList([4, 5, 6, 1, 2, 3]) L5 = L1 * 2 print(L5) # MyList([1, 2, 3, 1, 2, 3]) 练习: 实现有序集合类 OrderSet() 能实现两个集合的交集 &,全集 |, 补集 - 对称补集 ^, ==/!= , in/ not in 等操作 要求集合内部用 list 存储 class OrderSet: ... s1 = OrderSet([1, 2, 3, 4]) s2 = OrderSet([3, 4, 5]) print(s1 & s2) # OrderSet([3, 4]) print(s1 | s2) # OrderSet([1, 2, 3, 4, 5]) print(s1 ^ s2) # OrderSet([1, 2, 5]) if OrderSet([1, 2, 3]) != OrderSet([3, 4, 5]): print("不相等") if s2 == OrderSet(3, 4, 5): print('s2 == OrderSet(3, 4, 5) is True') if 2 in s1: print("2在 s1中")

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册