06.30.每日总结

📅 2026/7/1 10:27:11
06.30.每日总结
6月30日总结## 上午农民工项目 新增数据功能完成 写一下和千问的问答过程记录些有价值的知识问数据库execute的参数提交传递给execute的数据必须是一个元组或者列表。如果是一个字典需要使用命名占位符问什么是异步函数在编程中数据库查询I/O操作是非常耗时的。如果写 async def insert(data)就等于告诉 Python“这个函数里会有耗时的等待比如等数据库返回所以不要在这里死等你可以先去处理别的任务问针对为什么有时候警告同步异步不匹配但是路径装饰器里没有这种警告路由函数是框架调用的框架知道它是异步的所以框架会帮你 await不会报警告。路由内部调用的函数是你自己调用的如果你调用的是异步函数你必须亲自负责 await否则 Python 就会警告你“拿了号码牌不去取餐”。使用aiomysql步骤具体见模拟项目代码1 安装异步驱动2 修改数据库连接方式3 修改SQL执行函数4 在路由中调用补充在fastapi启动和关闭时要及时处理数据库连接池否则它不会正常初始化和释放方法见模拟项目cant set attribute问题它不是数据库连接或SQL的问题而是因为你原来的同步代码中某些地方直接对 cursor 或 connection 对象进行了属性赋值例如 cursor.xxx yyy而 aiomysql 的游标/连接对象是只读的不允许动态设置属性。result cursors.DictCursor.fetchone(selfdb)原因分析1 cursors.DictCursor 是一个类Class不是实例对象。2 当你写 fetchone(selfdb) 时Python 试图将 db一个 aiomysql 的 Cursor 实例强制赋值给 DictCursor.fetchone 方法的 self 参数。3 aiomysql 的底层 Cython/C 扩展严格限制了属性修改这种跨类型的强制 self 绑定直接触发了底层的 cant set attribute 保护机制。枚举类改为纯整数枚举from enum import IntEnumclass CraftEnum(IntEnum):钳工 1铆工 2钻工 3车工 4数控人员 5问表单传参一次性传多个值表单有name 但是具体的各种文本控件没有可以吗不行给 form 起 name 和给表单控件起 name 是完全不同的两件事。区别在于form namexxx这是给表单容器起名。它的作用是让 JavaScript 能通过 document.forms[xxx] 找到这个表单元素本身。它不会把任何数据发送给后端。input namexxx这是给数据字段起名。它的作用是告诉浏览器“当提交表单时把这个输入框里的值以 xxx 为键名打包发送”。这才是后端接收数据的唯一依据。问数据校验类转化为字典的方法.model_dump()一些重要用法1 枚举值自动转换 model_dump() 默认会将 GenderEnum.male 转为它的实际值 1不需要你手动 .value2 Pydantic v1 用户注意 如果你用的是老版本 Pydantic v1方法是 .dict() 而不是 .model_dump()3 按需导出字段 如果数据库表没有某个字段可以排除data.model_dump(exclude{worker_bank_number})4 字段名映射 如果 Python 字段名和数据库列名不一致可以在model_dump(by_aliasTrue) 配合 Field(aliasdb_column_name)使用问给SQL语句传参直接传入字典字典解包可以吗不可以应该使用命名占位符字典解包将 %s 改为 %(字段名)s数据库驱动就会自动从字典中按 key 取值并安全地绑定参数async def insert(data: dict) - bool:insert_clause INSERT INTO biz_worker ( worker_name, worker_age, worker_gender, worker_craft, worker_id_number, worker_bank_number) VALUES (%(worker_name)s, %(worker_age)s, %(worker_gender)s,%(worker_craft)s, %(worker_id_number)s, %(worker_bank_number)s 问关于通过数据校验时和最后传入数据库时数据的类型该怎么处理的问题在 Python 后端开发中有一个黄金原则“以业务本质定义模型以数据库需求做最后转换”。对于身份证号和银行卡号1 永远在 Pydantic 模型中定义为 str。因为它们在业务上属于“标识符”而不是用来做加减乘除的“数值”。2 在数据库层面如果数据库设计者把它们设计成了 INT 或 BIGINT你在传给数据库之前用 int() 转换一下即可。总结你只需要在 Pydantic 中安心地用 str 做长度校验然后在调用 await insert(worker_dict) 之前把需要存为整数的字段 int() 一下就能完美兼顾“数据安全性”和“数据库兼容性”了## 下午上课正则表达式正则表达式的结构[边界/分组开始] [种类(字符)] [数量(量词)] [边界/分组结束]在实际编写正则时标准的书写顺序通常是这样的[边界/分组开始] [种类(字符)] [数量(量词)] [边界/分组结束]写正则时心里默念这个顺序我要匹配什么写种类\d, \w, [a-z]我要匹配几个写数量*, , {3}我要限定位置吗写边界^, $, \b种类在前数量在后这是正则表达式的铁律。正则语法正则表达式的核心格式通常由以下几部分组成① 字符匹配. 匹配除换行符外的任意单个字符。\d 匹配数字等价于 [0-9]。\w 匹配字母、数字、下划线等价于 [a-zA-Z0-9_]。\s 匹配空白字符空格、制表符、换行符等。② 数量词量词* 匹配 0 次或多次。 匹配 1 次或多次。? 匹配 0 次或 1 次。{n} 精确匹配 n 次。{m,n} 匹配 m 到 n 次。③ 边界与定位^ 匹配字符串的开头。$ 匹配字符串的结尾。\b 匹配单词边界。④ 分组与捕获(...) 将括号内的内容作为一个整体分组并捕获匹配到的内容。(?:...) 非捕获分组只作为整体匹配不保存结果。| 或OR操作符。返回值与 Match 对象match()和search()才返回match对象匹配成功一旦找到匹配项立即返回一个 Match 对象封装了完整的匹配上下文信息。匹配失败若全程未匹配返回 None。如果匹配成功你可以通过 Match 对象的以下核心方法提取数据group()默认返回整个匹配的文本内容。groups()返回所有捕获组括号内的内容组成的元组。start() / end()返回匹配内容在原字符串中的起始与结束索引。span()以二元组形式返回 (start, end) 索引位置。贪婪模式和非贪婪模式1. 贪婪模式Greedy默认行为尽可能多地匹配在 Python 中所有的数量词*、、?、{m,n}默认都是贪婪的。性格“贪得无厌”。只要符合规则它会一直往后匹配直到遇到下一个不符合规则的条件为止。2. 非贪婪模式Non-greedy / Lazy加上 ?尽可能少地匹配只要在数量词后面加上一个 ?例如 *?、?、??它就会变成非贪婪模式。性格“见好就收”。只要匹配到了最少的数量并且满足了后面的条件它就立刻停止。正则表达式的分组在正则表达式中分组主要是通过 小括号 () 来实现的。它主要有三大核心作用作用一精确提取只要括号里的内容默认情况下re.match()或re.search()返回的是整个匹配到的字符串。但如果你只想要字符串中的某一部分就可以用()把它圈起来。作用二将多个字符作为一个整体配合数量词数量词如 *, , {m,n}默认只作用于它紧挨着的前一个字符。如果你想让数量词作用于一长串字符就必须用()把它们打包。作用三反向引用自己引用自己这就是我们上一轮讲过的 \1、\2。括号不仅能把内容“抓”出来还会给它们编号。第1个左括号(捕获的内容在正则内部可以用\1再次调用。第2个左括号(捕获的内容可以用\2调用。下午剩余时间写作业 C语言布尔类型 数据的类型转换其实C语言没有布尔类型本质也是整型0和1相关头文件;stdbool.h变量计算隐式转换和显示转换收窄转换建议不要这么做和拓宽转换无风险晚上写总结