分类 Python 小记 下的文章

tornado + peewee 下打印执行 SQL 日志


起步

最近在用 tornado + peewee + peewee-async 写自己的东西。有了早前工作上的重大教训,这次我一上手就着手打开 peewee 或者是 peewee-async 的 SQL 执行日志,遇到了点问题。最后问题解决了,但过程中产生的几个“为什么”想在这里记录一下。


SQLAlchemy 奇怪的查数据库行为


起步

进行数十亿数据压测时,测试环境发生了一个很奇怪的现象:在对 SQLAlchemy 查出的结果做遍历操作时,随着集合越大,遍历的时间跟着变长,是肉眼可见的变长。

根据现象,一位腾讯的程序员向我提出了疑问:会不会遍历过程中 SQLAlchemy 又去查询了数据库?


databases 连接 pg 查询时返回的数据类型


使用 databases 做异步查询的时候,sqlite、mysql 查询结果返回的都是元组类型,但是连接 pg 数据库的时候返回的是 Record 对象实例。

database = Database(
    'postgresql://postgres:password@192.168.111.136:54321/postgres', 
    min_size=5, 
    max_size=20
)
await database.connect()
query = "SELECT score, name, id FROM HighScores"
rows = await database.fetch_all(query=query)  # 查询
print(rows)  # 打印结果
await database.disconnect()

输出:

[<databases.backends.postgres.Record object at 0x000001BADB1E2A08>]


defaultdict 嵌套用法


起步

昨天在公司加班要处理这样一组数据:

{"村": "李村", "症状": "血糖", "姓名": "小李1"}
{"村": "李村", "症状": "血糖", "姓名": "小李2"}
{"村": "李村", "症状": "体量", "姓名": "小李3"}
{"村": "李村", "症状": "空腹", "姓名": "小李4"}
...

{"村": "刘村", "症状": "体量", "姓名": "小刘1"}
{"村": "刘村", "症状": "血糖", "姓名": "小刘2"}
{"村": "刘村", "症状": "空腹", "姓名": "小刘3"}
...

{"村": "王村", "症状": "空腹", "姓名": "小王1"}
{"村": "王村", "症状": "血糖", "姓名": "小王2"}
{"村": "王村", "症状": "体量", "姓名": "小王3"}
...

当时的需求是,统计出每个村每种症状的人数。数据是放在一个列表中一起返回的。


set() 去重原理


起步

众所周知,set() 是 Python 中的"天然去重因子"。对一串数据如:lyst = [1, 1, 2, 4, 4],我们常常 set 一下,也就是:set(lyst),达到去重目的。

那么,set() 是如何去重的呢?