当前位置:首页>python>Python小白入门教程:Python与数据库的邂逅——从SQLite到ORM实战

Python小白入门教程:Python与数据库的邂逅——从SQLite到ORM实战

  • 2026-09-11 02:26:23
Python小白入门教程:Python与数据库的邂逅——从SQLite到ORM实战

...(接上文,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开发入门,你会学到:

  • 网络编程的基础概念:IP、端口、HTTP协议。

  • 用Python的socket模块自己写一个简单的聊天程序。

  • 了解Web框架(如Flask),并创建你的第一个动态网站。

准备好迎接下一个挑战了吗?让我们继续前进!

✨ 重点回顾

  1. 数据库二选一:数据规整、要求严格用关系型;数据灵活、追求速度用非关系型。

  2. SQLite三板斧:connect()建立连接,cursor()创建游标,commit()提交事务。别忘了用with语句自动管理资源。

  3. ORM核心思想:类 <-> 表,对象 <-> 行,属性 <-> 字段。用SQLAlchemy可以让你写出更Pythonic的数据库代码。

  4. 实战要点:在改造待办系统时,体会数据库带来的持久化和结构化查询的优势。

最新文章

随机文章