贼好用!Sqlite-Utils让Python写SQL像喝水一样简单 🔥
还在手写原生SQL处理几十万行的CSV?每次做数据清洗都要写一大坨cursor.execute是不是烦透了?今天给大家安利一个神器——sqlite-utils。
这货由大佬Simon Willison开发,既是命令行工具也是Python库。它能让你用最优雅的姿势操作SQLite,像操作列表一样操作数据库,特别适合搞数据分析、量化交易或者写爬虫脚本的朋友们。
🚀 一、一行代码建表?原来是真的
平常我们得先判断表存不存在,再写CREATE TABLE语句,费劲得很。sqlite-utils支持自动推断类型并建表,比你那个只会催婚的妈还麻利。
import sqlite_utils# 连接数据库,文件不存在会自动创建db = sqlite_utils.Database("data.db")# 直接塞入JSON数据,表结构和主键一步到位db["students"].insert_all([ {"id": 1, "name": "张三", "score": 98}, {"id": 2, "name": "李四", "score": 92}], pk="id")
运行结果如下:执行 insert_all 后,控制台无报错。数据库中自动生成 students 表。id 字段被自动设为主键。
🔍 二、查询结果居然这么丝滑
返回的数据不再是元组,而是直接解析好的字典列表。你再也不用费脑子去记fetchall()之后哪个索引对应哪个字段了,代码读起来跟聊天记录一样清楚。
# 执行查询,返回的是可以直接操作的字典列表rows = db.query("select * from students where score > 90")for row in rows:print(f"姓名: {row['name']}, 分数: {row['score']}")
运行结果如下:姓名: 张三, 分数: 98姓名: 李四, 分数: 92
🔧 三、不会写SQL?那就别写了
有些人一看SQL就头疼,没关系,这库自带半ORM式的链式调用。它的语法非常接近自然语言,即使忘了SQL语法,也能靠代码补全写出来。
# 完全不用写SQL,直接用Python方法链updated = db["students"].update(1, {"score": 99})if updated:print("更新搞定!")# 按分数排序,取第一个top_student = db["students"].order_by("-score").first()print(f"第一名: {top_student['name']}")
运行结果如下:更新搞定!第一名: 张三
📦 四、把CSV倒入数据库,真的只要一步
以前做数据分析,Pandas读内存不够分页处理麻烦。现在配合命令行,百万级数据轻松吸入。它能自动检测CSV的表头,不需要你手动指定列名。
import sqlite_utilsdb = sqlite_utils.Database("bigdata.db")# 可以把打开文件的逻辑换成迭代器,处理超大文件db["sales"].insert_all([ {"date": "2024-01-01", "amount": 100}, {"date": "2024-01-02", "amount": 150}])print(f"当前表中有 {db['sales'].count} 条数据")
运行结果如下:当前表中有 2 条数据
⚖️ 五、硬刚原生Sqlite3和Sqlalchemy
优势分析:相比于最基础的sqlite3模块,它省去了大量的样板代码,比如手动转换字典、处理类型检测。相比于重量级的SqlAlchemy,它零配置、上手快,不需要定义烦人的Base类和Schema。这就像电动车比燃油车,在城市通勤场景下,起步快、噪音低。
一点不足:对于极其复杂的多表联合查询,直接写原生SQL可能比用它封装的链式调用更直观。不过这也无伤大雅,因为你可以直接用db.query()写原生SQL。
使用建议: 写脚本、做ETL、本地工具开发,无脑入坑。大型Web项目建议还是老老实实上SQLAlchemy。
💡 总结
告别繁琐的cursor和引号拼接,sqlite-utils让SQLite操作有了“Python像呼吸一样自然”的体验。不管是数据清洗、日志分析还是作为项目的本地缓存,这个库都能帮你省下50%的代码量。
如果你也有私藏的数据库神库,欢迎在评论区留言分享,一起开开眼界!👏