Python进阶教程:数据库操作入门
🕒 阅读时间:6 分钟📝 字数:970👀 阅读量:Loading...
本文摘要
数据库(Database)是有组织存储数据的仓库,支持高效增删改查(CRUD)。SQLite:轻量级,单文件…
目录
本文是 Python 入门教程系列 的第 7 篇。前面介绍了并发编程,本篇讲解 Python 中数据库操作,以 SQLite 和 MySQL 为例。
一、什么是数据库
数据库(Database)是有组织存储数据的仓库,支持高效增删改查(CRUD)。常用关系型数据库:
- SQLite:轻量级,单文件,适合学习和小型应用
- MySQL / MariaDB:最流行的开源数据库
- PostgreSQL:功能强大的开源数据库
关系型数据库用 SQL(结构化查询语言) 操作数据。
二、SQL 基础
-- 建表CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT UNIQUE);
-- 插入INSERT INTO users (name, age, email) VALUES ("Alice", 20, "alice@example.com");
-- 查询SELECT * FROM users WHERE age > 18;
-- 更新UPDATE users SET age = 21 WHERE name = "Alice";
-- 删除DELETE FROM users WHERE id = 1;三、SQLite:内置数据库
Python 自带 sqlite3 模块,无需安装任何东西:
import sqlite3
# 连接(文件不存在会自动创建)conn = sqlite3.connect("demo.db")cursor = conn.cursor()
# 建表cursor.execute("""CREATE TABLE IF NOT EXISTS students ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, score REAL)""")
# 插入数据cursor.execute("INSERT INTO students (name, score) VALUES (?, ?)", ("张三", 88.5))cursor.execute("INSERT INTO students (name, score) VALUES (?, ?)", ("李四", 92.0))conn.commit()
# 查询cursor.execute("SELECT * FROM students")for row in cursor.fetchall(): print(row)
# 关闭连接conn.close()四、参数化查询防注入
永远不要用字符串拼接 SQL,应使用参数化查询防止 SQL 注入:
import sqlite3
conn = sqlite3.connect("demo.db")cursor = conn.cursor()
# 错误示范(有注入风险)# name = input("输入姓名:")# cursor.execute(f"SELECT * FROM students WHERE name = '{name}'")
# 正确做法:占位符 ?name = "张三"cursor.execute("SELECT * FROM students WHERE name = ?", (name,))print(cursor.fetchall())
conn.close()五、ORM 简介
直接写 SQL 较繁琐,实际项目常用 ORM(对象关系映射),如 SQLAlchemy:
# pip install sqlalchemyfrom sqlalchemy import create_engine, Column, Integer, String, Floatfrom sqlalchemy.orm import declarative_base, sessionmaker
Base = declarative_base()
class Student(Base): __tablename__ = "students_orm" id = Column(Integer, primary_key=True) name = Column(String(50), nullable=False) score = Column(Float)
# 连接数据库engine = create_engine("sqlite:///orm_demo.db")Base.metadata.create_all(engine)
# 增删改查Session = sessionmaker(bind=engine)session = Session()
student = Student(name="王五", score=95.5)session.add(student)session.commit()
result = session.query(Student).filter(Student.score > 90).all()for s in result: print(s.name, s.score)
session.close()六、实战:学生成绩管理系统
综合运用所学知识,实现一个简单的学生成绩管理:
import sqlite3
class ScoreManager: def __init__(self, db="scores.db"): self.conn = sqlite3.connect(db) self.cursor = self.conn.cursor() self.cursor.execute(""" CREATE TABLE IF NOT EXISTS students ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, score REAL ) """) self.conn.commit()
def add(self, name, score): self.cursor.execute("INSERT INTO students (name, score) VALUES (?, ?)", (name, score)) self.conn.commit() print(f"添加成功:{name} {score}分")
def list_all(self): self.cursor.execute("SELECT * FROM students") for row in self.cursor.fetchall(): print(row)
def top(self, n=3): self.cursor.execute("SELECT * FROM students ORDER BY score DESC LIMIT ?", (n,)) for row in self.cursor.fetchall(): print(f"高分榜:{row}")
def close(self): self.conn.close()
# 使用示例mgr = ScoreManager()mgr.add("张三", 88.5)mgr.add("李四", 92.0)mgr.add("王五", 95.5)mgr.list_all()mgr.top(2)mgr.close()总结
本篇介绍了 SQL 基础、SQLite 内置数据库、参数化查询防注入、ORM 概念,并用学生成绩管理系统串联实战。下一篇将介绍数据分析入门(NumPy 与 Pandas),敬请期待!
Python进阶教程:数据库操作入门
作者:Wang Shijie
本文链接:https://wsj-blog.pages.dev/posts/python-jin-jie-jiao-cheng-shu-ju-ku-cao-zuo-ru-men/
本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
留言评论
评论资源加载失败,请重试。