- 博客(29)
- 收藏
- 关注
原创 SQLALchemy如何将SQL语句编译为特定数据库方言
最近在一个使用fastapi+tortoise-orm的项目中,需要将orm的语句编译成特定数据库方言,但是查询了官方文档及一些资料却找不到合适的方法论😔,于是乎我就把目光放到了sqlalchemy身上,东找西找给我找着了。话不多说,请看代码。创建一个 INSERT 语句对象,然后获取模型实例的对应列的值,使用stmt.compile编译成mysql的方言。但是这个方法对于json类型的字段会编译失败,出现。创建原始SQL文本语句,使用参数占位符。将实际值绑定到SQL语句中的占位符,因此,介绍下一个方法。
2025-01-02 11:28:09
331
原创 生成器与迭代器的关系
是 Python 中的两个核心概念,广泛用于简化处理可迭代数据的流程。它们密切相关但有重要区别。关键字返回值,每次调用会暂停执行,等待下次迭代时继续运行。是一种特殊的迭代器,使用函数生成,避免了手动实现。生成器函数使用 yield。
2024-12-03 11:52:32
430
1
原创 Python线程条件对象(Condition)
在Python线程中,`threading`模块提供了条件变量`condition`来支持线程之间的复杂同步。条件变量运行一个或多个线程等待,直到另一个线程发出特定的通知信号。条件变量通常与锁(`Lock`或`RLock`)一起使用。`threading.Condition()`的锁对象可以通过传入的方式获得,或者在缺省的情况下自动创建(此时自动创建的锁对象为递归锁对象`RLock`)。当多个条件变量需要共享同一个锁时,传入一个锁很有用。锁是条件对象的一部分,你不必单独跟踪它。
2024-05-21 10:12:55
966
原创 Python线程中start,run,join方法及守护线程模式的作用
单个进程中的执⾏单元。⼀个进程启动后,只使⽤⼀个线程,即主线程。通过调⽤操作系统 API ,进程可以创建更多线程,执⾏并发操作。⼀个进程内的线程共享相同的内存空间(存储活动的 Python 对象)。因此,线程之间可以轻松地共享数据,但是如果多个线程同时更新同⼀个对象,则可能导致数据损坏。与进程⼀样,线程在操作系统调度程序的监督下也可以实现抢占式多任务处理。对于同⼀份作业,线程消耗的资源⽐进程少。
2024-05-16 14:36:10
1246
原创 Python上下文管理器with块及@contextmanager的用法
上下文管理器对象存在的目的是为了管理with块,就像迭代器的存在是为了管理for循环一样with 语句存在的意义是对一些常用的 try/finally 结构予以简化。这种结构能够保障一段代码在运行完成后实施某项操作,就算该段代码因为 return 语句、异常或者 sys.exit() 调用而停止,也依旧执行指定的操作。finally 子句中的代码往往用于释放重要的资源,亦或是还原临时变动的状态。
2024-05-14 10:03:36
984
1
原创 yield from的具体用法
yield from 是 Python 3.3 引入的语法,用于在生成器中委托生成器。它允许一个生成器函数可以将执行委托给另一个生成器,从而简化了代码结构。在一个生成器函数内部,yield from 语句用于将控制权转移到另一个生成器,然后将其产生的值直接发送给生成器的调用者,而不是在当前生成器中进行处理。
2024-05-09 16:41:44
577
原创 Python标准库中的生成器函数大全(非常详细)
用于筛选的生成器函数:从输入的可迭代对象中产生项的子集,而且不修改项本身。多数可筛选生成器接收一个predicate参数。这个参数的值是个布尔函数,接收一个参数,应用到输入中的每一项上,用于判断项是否包含在输出中。
2024-05-08 20:18:10
1161
原创 Python中的生成器是什么
只要Python函数的主体中有yield关键字,该函数就是生成器函数。调用生成器函数,返回一个生成器对象。也就是说,生成器函数是生成器工厂。
2024-05-07 17:24:15
2166
原创 Fastapi中怎么一次性运行多个Scrapy爬虫
运行Scrapy爬虫很简单,直接"Scrapy crawl 爬虫名称"即可。但是我们如果想在Fastapi中通过接口的方式一次性运行多个爬虫。那该怎么实现?
2024-05-06 16:17:55
934
2
原创 详细解析Python可迭代对象与迭代器
迭代是数据处理的基石:程序将计算应用于数据序列。如果数据太大,在内存中放不下,则需要采用“惰性”的方式获取数据,即只按需获取和处理数据项的一部分,而不是一次性加载整个数据集。这就是迭代器的作用。
2024-05-05 23:24:26
2317
3
原创 深入剖析序列的特殊方法
在面向对象编程中,协议是非正式的接口,只在文档中定义,不在代码中定义。例如:Python的序列协议只要实现__len__和__getitem__这两个特殊方法。任何类,只要使用标准的签名和语义实现了这两个方法,就能用在任何预期序列的地方。
2024-05-03 14:12:57
650
2
原创 Python中覆盖类属性最好的方法
有一种修改方法更为符合Python风格,而且效果持久,也更有针对性。类属性是公开的会被子类继承,于是我们经常会创建一个子类,只用于定制类的数据属性。Django基于类的视图就大量使用这种技术。
2024-05-02 18:39:48
521
2
原创 Python中备选构造函数,classmethod和staticmethod的用法
定义操作类而不是操作实例的方法。由于classmethod改变了调用方法的方式,因此接收的第一个参数是类本身(一般叫做cls),而不是实例。classmethod可以访问类的属性,并且可以通过cls参数来创建类的实例。classmethod最常见的用途是定义备选构造函数。
2024-05-02 10:33:53
632
3
原创 使用一等对象函数重构策略模式
策略模式是一种软件设计模式,它允许在运行时根据需要选择算法或策略。这种模式通过将每个算法封装到一个独立的类中,并使这些类可相互替换来实现这一点。策略模式使得算法可以独立于其使用者而变化,同时还可以简化使用者的代码。策略模式的核心思想是将算法的实现与其使用者解耦,使得算法可以独立于其使用者进行变化。这种灵活性使得策略模式在需要动态切换算法、避免代码膨胀以及实现复杂的条件逻辑时非常有用。
2024-04-30 14:56:42
2637
原创 标准库中让人印象深刻的装饰器:Cache和单分派
functools.cache装饰器实现了备忘。这是一项优化技术,能把耗时的函数得到的结果保存起来,避免传入相同参数时重复计算。@lru_cache的优势主要在于可以通过maxsize参数限制内存用量上限。maxsize参数的默认值相当保守,只有128,即缓存最多只有128条。
2024-04-28 22:08:31
693
1
原创 git如何将多个commit合并成一个?
我们使用git进行版本控制,在本地开发完某个功能时,需要提交commit,然后push至开发分支。简单的功能还好,几个commit可能就好了。但是如果功能比较复杂,commit多达十几甚至几十个时,commit管理就会很冗长。比如下面多达40多个的commit
2024-04-28 11:15:00
2042
原创 装饰器与闭包不为人知的一面
装饰器是 Python 中一种强大的工具,它允许你在不修改原始函数代码的情况下,动态地修改或扩展函数的行为。装饰器通常用于修改函数的行为、添加额外的功能、验证输入、记录日志等。
2024-04-26 20:35:40
455
2
原创 函数是Python的一等对象?
在Python中,函数是一等对象。编程语言中的一等对象的定义:在运行时创建,能赋值给变量或数据结构中的元素,能作为参数传递给函数,能作为函数的返回结果。
2024-04-26 10:30:06
966
2
原创 搜索Mysql的JSON字段的值
我们在查询mysql数据时,查询某个字段的数剧是我们经常接触的,直接使用sql语句或者更方便的直接使用数据库的orm语句查询。但是如果需要查询某个json字段里面的某些数据,orm模型可能都无法达到效果,还不如直接使用sql语句进行查询来的直观。下面总结了一些sql语句查询json字段里面的值。
2024-04-25 14:15:45
3871
1
原创 Python对象引用、可变性及垃圾回收
在Cpython中,垃圾回收使用的主要算法是引用计数。实际上,每个对象都会统计有多少引用指向自己。当引用计数归零时,对象立即销毁:Cpython对象上调用__del__方法,然后释放分配给对象的内存。Cpython2.0增加了分代垃圾回收算法,用于检测引用循环中涉及的对象组——如果一组对象之间全是相互引用,那么即使再出色的引用方式也会导致组中的对象不可达。分代垃圾回收算法能把引用循环中不可达的对象销毁。
2024-04-24 22:23:33
945
1
原创 Python数据类构建器(二)
collections.namedtuple是一个工厂函数,用于构建增强的tuple子类,具有字段名称,类名等属性。namedtuple构建的类可在任何需要元祖的地方使用。甚至以前Python标准库中发挥元祖的很多函数,现在都返回具名元祖,这对用户的代码没有任何影响,可读性也大大提高。
2024-04-24 19:02:45
722
原创 Python数据类构建器(一)
Python提供几种构建简单类的方式,这些类只是字段的容器,几乎没有额外的功能,这种模式被称为“数据类”(data class)。下面介绍3个可简化数据类构建过程的类构建器。collectons.namedtuple,最简单的构建方式,从Python2.6开始提供typing.NamedTuple,需要为字段添加类型提示,从Python3.5开始提供。class句法在3.6中添加@dataclasses.datacless,与前两种相比,可定制的内容更多,添加了大量选项,可实现更复杂的功能。
2024-04-23 19:36:45
1104
原创 非常详细的Python字典高级用法介绍(三)
Python 使用哈希表实现 dict,因此字典的效率非常高,不过这种设计对实践也有⼀些影响,不容忽视。键必须是可哈希对象,必须正确实现__hash__和__eq__方法通过键访问项速度非常快,对于一个包含数百万个键的dict对象,Python通过计算哈希码就可以直接定位键,然后找出索引在hash表中的偏移量,稍微尝试几次就可以找到匹配的条目,因此开销不大在CPython3.6中,dict的内存布局更为紧凑,顺带的一个副作用是键的顺序得以保留。Python3.7正式支持保留顺序
2024-04-22 21:16:52
375
原创 非常详细的Python字典高级用法介绍(二)
dict基类本身没有定义这个方法,但是如果dict子类定义了这个方法,那么dict.__getitem__找不到键时将会调用__missing__方法,不抛出KeyError。标准库中的 shelve 模块持久存储字符串键与(以 pickle ⼆进制格式序列化的)Python 对象之间的映射,这部分这里不作太多介绍,感兴趣可以去看Python文档。在字典高级用法(一)中介绍过自动处理缺失的键的第一种方法是使用defaultlist对象,现在我们接着介绍第二种方法,使用__missing__方法。
2024-04-21 21:10:11
541
1
原创 非常详细的Python字典高级用法介绍(一)
没有Python程序不使用字典,即使不直接出现在我们编写的代码中,我们也会间接的用到,因为字典dict是实现Python的基石,也可以说Python就是包裹在一堆语法糖中的字典。由于字典的关键作用,Python对字典做了高度优化,并且在持续改进,Python字典之所以高效,要归功于哈希表。除了字典以外,内置类型中的set和frozenset也是基于哈希表。这两种类型的API和运算符比其他流行语言的集合更加丰富。接下来就开始字典常见的高级用法介绍
2024-04-21 14:06:37
1068
1
原创 当Python列表不适用时,该如何选择?
在编写Python代码时,我们有时过渡使用列表,因为列表实在是太方便了。list类型简单灵活,不过有时针对具体的需求,或许还有更好的选择。
2024-04-20 22:25:49
996
原创 Fastapi,tortoise-orm怎么实现数据库的迁移
在你添加完以后,需要把@app.on_event("startup")事件函数中await command.migrate()注释解开,重新启动服务即可,此时你会发现migrations/models文件夹下面新增了一个文件1_时间_update.py文件(注意生成新的迁移文件后,你需要再次把wait command.migrate()部分重新注释,避免误操作生成新的迁移文件),这时你会发现已经数据表结构已经更改成功了。1、在fastapi中配置tortoise-orm所需要注册的配置信息。
2024-04-19 17:04:42
1551
原创 Python Match/Case高级用法之匹配序列
python标准库用c语言实现了丰富的序列,主要分成两列:容器序列:可存放不同类型的项,其中包括嵌套容器。⽰例:list、tuple和collections.deque。扁平序列:可存放⼀种简单类型的项。⽰例:str、bytes 和array.array。
2024-04-19 11:39:44
718
原创 元祖不仅仅作为不可变列表?
python解释器求解元祖字面量时,经过一次操作即可生成元祖常量的字节码,求解列表字面量时,⽣成的字节码将每个元素当作独⽴的常量推⼊数据栈,然后构建列表。元祖被称为不可变列表,但是这并没有完全概况元祖的特点,元祖除了可以用作不可变列表的使用,还可以用做没有字段名称的记录,但是这种用法往往被忽略。然而,元组的不可变性仅针对元组中的引⽤⽽⾔。只有值永远不可变的对象才是可哈希的,不可哈希的元祖不可作为字典的键,也不可作为集合的元素。⽤元组存放记录,元组中的⼀项对应⼀个字段的数据,项的位置决定数据的意义。
2024-04-18 17:10:45
307
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人