用 Python 操控数据库 · 开启全自动数据之旅
纯动手实践环节:请大家打开电脑,跟着敲!
敲代码,看效果,不怕报错!
提示:基础薄弱的同学不用怕,今天的代码我们会一行一行拆开揉碎了讲!
磨刀不误砍柴工
上节理论课我们说过,Python 不懂 MongoDB 的语言,我们需要请一位翻译官 —— PyMongo 库。
动手操作: 请打开你的 PyCharm(或命令行),在终端输入以下命令:
新建一个 demo.py 文件,敲入以下代码:
import pymongo # 1. 建立与数据库的连接 (填入你的IP和端口) client = pymongo.MongoClient("mongodb://localhost:27017/") # 2. 测试一下是否连通 print(client.server_info())
import pymongo:把刚刚安装的翻译官请进代码里。MongoClient(...):拨打电话。localhost 代表本机,27017 是 MongoDB 默认的门牌号(端口)。server_info():这是去问数据库“你在吗?”,如果运行没报错且打印出一大串信息,说明连接成功!让数据在代码中流动起来
连接上服务器后,我们要告诉它:往哪个库的哪张表里写数据?
db = client["school"]
如果 school 库不存在,MongoDB 会在稍后存数据时自动帮你创建,非常省心!
col = db["students"]
集合就相当于 MySQL 里的“表”。同样,不存在也会自动创建。
接下来的所有操作,我们都将基于 col 这个变量进行!
# 1. 准备一条数据 (Python 字典) student1 = { "name": "李四", "age": 20, "major": "大数据技术", "score": 88 } # 2. 执行插入操作 result = col.insert_one(student1) # 3. 打印系统自动分配的 ID print("插入成功,ID为:", result.inserted_id)
insert_one() 方法,直接把字典塞进去即可。_id,防止数据重复。请大家运行这段代码,看到打印出的 ID 就算成功!
一条条写太慢了,如果爬虫抓到了1000条数据怎么办?用 列表包含字典 的格式,一次性插入!
# 1. 准备多条数据 (放到一个列表 [ ] 里) student_list = [ {"name": "王五", "age": 19, "major": "软件工程", "score": 95}, {"name": "赵六", "age": 21, "major": "大数据技术", "score": 72}, {"name": "钱七", "age": 20, "major": "人工智能", "score": 60} ] # 2. 执行批量插入 res = col.insert_many(student_list) # 3. 看看插入了多少条? print("批量插入成功!生成的ID有:", res.inserted_ids)
实践时间:把这段代码加到你的 demo.py 里并运行。
find_one():只返回匹配到的第一条数据。find():返回所有匹配的数据(由于数据可能很多,它返回的是一个迭代器,需要用 for 循环打印)。# 找出一个叫王五的人
result = col.find_one({"name": "王五"})
print(result)
# 括号里什么都不写,代表查询所有 all_students = col.find() for stu in all_students: print(stu)
* 别忘了用 for 循环,否则你只会打印出一个游标对象(Cursor)哦!
老板要求:“把分数大于 80分的学生给我找出来!” 怎么做?
{"score": {"$gt": 80}}
Greater Than 的缩写
{"score": {"$lt": 60}}
Less Than 的缩写 (不及格抓出来)
{"major": {"$in": ["软件", "大数据"]}}
只要匹配列表里任何一个就行
# 动手实验:查询分数大于 80 分的学生 query = {"score": {"$gt": 80}} for stu in col.find(query): print(stu['name'], "是学霸!")
更新数据需要两个参数:
$set 操作符) 危险操作警告: 如果不写 $set,这条数据会被直接整条替换掉,只剩下你新写的字段!
# 任务:钱七同学补考通过了,分数改成 65 分 condition = {"name": "钱七"} new_value = {"$set": {"score": 65}} # 执行更新 col.update_one(condition, new_value) print("修改完毕,大家可以用 find() 验证一下!")
有同学退学了,我们需要把他的数据清理掉。这个操作很简单,但要极其小心!
col.delete_one({"name": "李四"})
只删除匹配到的第一条。比较安全。
col.delete_many({"score": {"$lt": 60}})
把所有不及格的同学全删了!(威力巨大)
C (Create): insert_one() / insert_many()
R (Read): find_one() / find()
U (Update): update_one() 加 $set
D (Delete): delete_one() / delete_many()
大数据开发工程师每天写的数据清洗、爬虫入库,底层就是这四个基本动作的排列组合!
告别单机玩具,体验企业级真功夫 (简单体验版)
刚才我们敲的代码都是在“单机”上跑的。如果你的电脑硬盘坏了,刚才录入的“学霸王五”就没了。
(在 mongo shell 终端输入,仅作演示了解)
> rs.initiate()
{
"info2" : "no configuration specified...",
"ok" : 1
}
> rs.add("192.168.1.102:27017")
通过 rs.initiate() 和 rs.add(),我们就能把多台电脑绑成一个不会宕机的坚固阵营。
哪怕有了复制集,如果有程序员手滑执行了 delete_many({}),所有机器的数据也会瞬间同步消失。我们需要冷备份!
打开系统命令行(不是Python, 不是mongo),敲入:
这会把 school 库变成文件,塞进 my_backup 文件夹。
如果数据被删了,用这个命令把文件夹里的数据倒回数据库:
时光倒流,数据起死回生!
脱离教材,独立完成企业级小需求
不再是刚才的学生分数表了,换个场景试试!
老板要求你编写一个 Python 脚本(新建一个名为 shop_task.py 的文件),全自动完成以下四步操作:
pet_shop,选用集合 pets。将以下数据结构转换为 Python 列表并插入:
- 姓名: 旺财, 种类: 狗, 价格: 500
- 姓名: 喵喵, 种类: 猫, 价格: 800
- 姓名: 大黄, 种类: 狗, 价格: 300
老板想看店里所有的“狗”。
请用 find() 加上条件 `{"种类": "狗"}`,并用 for 循环把找出来的宠物名字打印在屏幕上。
猫粮太贵了,老板要求把名叫“喵喵”的宠物价格,修改为 1000。
提示:别忘了用 `$set`,否则数据会丢失!
实践倒计时 15 分钟,现在开始!完成后请举手示意老师检查代码运行结果!
今天你不仅学会了 PyMongo,还独立完成了一个数据库小脚本!
下课别忘了保存你的 Python 代码哦!
遇到问题的同学请留在座位上,老师马上来帮你排错!