...(接上文,from sql处)
python
from sqlalchemy import create_engine, Column, Integer, Stringfrom sqlalchemy.orm import declarative_base, sessionmaker# 1. 创建数据库引擎(连接桥梁)engine = create_engine('sqlite:///user_orm.db', echo=True)# echo=True 会在控制台打印SQL语句,方便调试# 2. 定义基类和模型类(把表映射成Python类)Base = declarative_base()classUser(Base): __tablename__ ='users'# 指定数据库中的表名id= Column(Integer, primary_key=True, autoincrement=True) name = Column(String(50), nullable=False) age = Column(Integer)def__repr__(self):returnf"<User(name='{self.name}', age={self.age})>"# 3. 创建表(如果表不存在)Base.metadata.create_all(engine)# 4. 创建会话类(用于操作数据库的“手柄”)Session = sessionmaker(bind=engine)# 5. 开始用对象的方式操作数据库# 5.1 增:添加新用户session = Session()# 创建会话user1 = User(name='扣子', age=25)user2 = User(name='小明', age=20)session.add(user1)session.add(user2)session.commit()# 提交事务# 5.2 查:查询所有用户users = session.query(User).all()print("查询所有用户:", users)# 5.3 查:按条件查询(获取name为'小明'的第一个用户)xiaoming = session.query(User).filter_by(name='小明').first()print("查询小明:", xiaoming)# 5.4 改:修改小明的年龄if xiaoming: xiaoming.age =21 session.commit()# 5.5 删:删除用户(这里演示删除年龄大于30的,当前无数据)# session.query(User).filter(User.age > 30).delete()# session.commit()# 6. 再次查询验证updated_users = session.query(User).all()print("修改后的所有用户:", updated_users)session.close()# 关闭会话运行这段代码,你会发现完全用操作Python对象的方式(如user1.name)代替了编写SQL语句,代码变得更加直观、安全且与数据库解耦。
12.4 实战:为待办事项管理系统添加数据库支持
学了SQLite和ORM,我们来改造最初的待办事项管理系统,让它从文本文件存储升级为数据库存储,体验一下数据库带来的便利。
python
# todo_db.pyfrom sqlalchemy import create_engine, Column, Integer, String, Booleanfrom sqlalchemy.orm import declarative_base, sessionmakerfrom datetime import datetime# 1. 定义模型Base = declarative_base()classTodoItem(Base): __tablename__ ='todos'id= Column(Integer, primary_key=True) content = Column(String(200), nullable=False) is_done = Column(Boolean, default=False) created_at = Column(String(20), default=datetime.now().strftime("%Y-%m-%d %H:%M"))# 2. 初始化数据库engine = create_engine('sqlite:///todos.db')Base.metadata.create_all(engine)Session = sessionmaker(bind=engine)# 3. 定义操作函数defadd_todo(content):"""添加待办事项""" session = Session() new_item = TodoItem(content=content) session.add(new_item) session.commit()print(f"已添加:{content}") session.close()deflist_todos():"""列出所有待办事项""" session = Session() items = session.query(TodoItem).all()ifnot items:print("待办事项列表是空的。")else:for item in items: status ="✓"if item.is_done else"✗"print(f"{item.id}. [{status}] {item.content} (创建于: {item.created_at})") session.close()defmark_done(todo_id):"""标记为完成""" session = Session() item = session.query(TodoItem).filter_by(id=todo_id).first()if item: item.is_done =True session.commit()print(f"事项 {todo_id} 已完成!")else:print(f"未找到ID为 {todo_id} 的事项") session.close()defdelete_todo(todo_id):"""删除事项""" session = Session() item = session.query(TodoItem).filter_by(id=todo_id).first()if item: session.delete(item) session.commit()print(f"事项 {todo_id} 已删除。")else:print(f"未找到ID为 {todo_id} 的事项") session.close()# 4. 简单的命令行交互(复用之前的逻辑)if __name__ =="__main__":whileTrue:print("\n请选择操作:1. 添加 2. 列出 3. 完成 4. 删除 5. 退出") choice =input("输入数字: ")if choice =='1': content =input("请输入待办事项: ") add_todo(content)elif choice =='2': list_todos()elif choice =='3':try: todo_id =int(input("请输入要标记完成的事项ID: ")) mark_done(todo_id)except ValueError:print("请输入有效的数字ID")elif choice =='4':try: todo_id =int(input("请输入要删除的事项ID: ")) delete_todo(todo_id)except ValueError:print("请输入有效的数字ID")elif choice =='5':print("再见!")breakelse:print("无效输入,请重新选择。")这个版本的程序,数据会持久化存储在todos.db文件中,即使程序关闭再打开,之前的待办事项也不会丢失。而且,得益于数据库的查询能力,未来你可以非常方便地增加“按日期查询”、“只显示未完成事项”等功能。
12.5 本章小结
数据库分类:记住了关系型(如SQLite、MySQL)和非关系型(如MongoDB、Redis)两大阵营,以及它们各自适合的场景。
原生SQL操作:学会了使用Python内置的sqlite3模块,通过连接→游标→执行SQL→提交→关闭这五个核心步骤操作SQLite数据库。
ORM魔法:了解了ORM(对象关系映射)的思想,并通过SQLAlchemy体验了用Python类和方法操作数据库的便捷与优雅。
实战应用:成功将待办事项系统从脆弱的文本文件存储,升级到了稳定、强大的数据库存储。
从下一章开始,我们将进入Python在网络开发领域的应用,学习如何用Python写一个简单的Web服务器和API接口。
总结与预告
到本章为止,我们已经走过了Python基础语法、函数与模块、面向对象编程、文件与异常,再到高级的并发编程和数据库操作。你的魔法工具箱已经相当充实了!
下一章,我们将开启全新的篇章——第十三章:Python网络编程与Web开发入门,你会学到:
准备好迎接下一个挑战了吗?让我们继续前进!
✨ 重点回顾
数据库二选一:数据规整、要求严格用关系型;数据灵活、追求速度用非关系型。
SQLite三板斧:connect()建立连接,cursor()创建游标,commit()提交事务。别忘了用with语句自动管理资源。
ORM核心思想:类 <-> 表,对象 <-> 行,属性 <-> 字段。用SQLAlchemy可以让你写出更Pythonic的数据库代码。
实战要点:在改造待办系统时,体会数据库带来的持久化和结构化查询的优势。