Python与数据库:SQLite、MySQL、PostgreSQL详解

张开发
2026/6/1 16:39:58 15 分钟阅读
Python与数据库:SQLite、MySQL、PostgreSQL详解
Python与数据库SQLite、MySQL、PostgreSQL详解前言大家好我是第一程序员名字大人很菜。作为一个非科班转码、正在学习Rust和Python的萌新最近我开始学习Python与数据库的交互。说实话一开始我对数据库的概念还很模糊但随着学习的深入我发现数据库是编程中非常重要的一部分。今天我想分享一下我对Python与数据库交互的学习心得希望能给同样是非科班转码的朋友们一些参考。一、SQLite数据库1.1 SQLite简介SQLite是一个轻量级的嵌入式数据库它不需要单独的服务器进程数据存储在一个文件中轻量级核心库很小适合嵌入式应用无需配置不需要安装和配置服务器跨平台支持多种操作系统ACID兼容支持原子性、一致性、隔离性、持久性1.2 使用sqlite3模块Python内置了sqlite3模块可以直接与SQLite数据库交互import sqlite3 # 连接到SQLite数据库 # 如果数据库不存在会自动创建 conn sqlite3.connect(example.db) # 创建游标 cursor conn.cursor() # 创建表 cursor.execute( CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER, email TEXT UNIQUE ) ) # 插入数据 cursor.execute(INSERT INTO users (name, age, email) VALUES (?, ?, ?), (Alice, 25, aliceexample.com)) cursor.execute(INSERT INTO users (name, age, email) VALUES (?, ?, ?), (Bob, 30, bobexample.com)) # 提交事务 conn.commit() # 查询数据 cursor.execute(SELECT * FROM users) rows cursor.fetchall() for row in rows: print(row) # 更新数据 cursor.execute(UPDATE users SET age ? WHERE name ?, (26, Alice)) conn.commit() # 删除数据 cursor.execute(DELETE FROM users WHERE name ?, (Bob,)) conn.commit() # 关闭连接 conn.close()1.3 使用SQLite的优势无需安装Python内置支持易于使用API简单直观适合小型应用适合数据量不大的应用便于测试适合单元测试和集成测试二、MySQL数据库2.1 MySQL简介MySQL是一个流行的关系型数据库管理系统功能强大支持复杂的SQL语句和事务可扩展性适合大型应用社区活跃有庞大的社区支持开源免费开源软件免费使用2.2 使用pymysql库需要安装pymysql库来与MySQL数据库交互# 安装pymysql # pip install pymysql import pymysql # 连接到MySQL数据库 conn pymysql.connect( hostlocalhost, userroot, passwordpassword, databasetest, charsetutf8mb4, cursorclasspymysql.cursors.DictCursor ) # 创建游标 cursor conn.cursor() # 创建表 cursor.execute( CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, age INT, email VARCHAR(255) UNIQUE ) ) # 插入数据 cursor.execute(INSERT INTO users (name, age, email) VALUES (%s, %s, %s), (Alice, 25, aliceexample.com)) cursor.execute(INSERT INTO users (name, age, email) VALUES (%s, %s, %s), (Bob, 30, bobexample.com)) # 提交事务 conn.commit() # 查询数据 cursor.execute(SELECT * FROM users) rows cursor.fetchall() for row in rows: print(row) # 更新数据 cursor.execute(UPDATE users SET age %s WHERE name %s, (26, Alice)) conn.commit() # 删除数据 cursor.execute(DELETE FROM users WHERE name %s, (Bob,)) conn.commit() # 关闭连接 conn.close()2.3 使用MySQL的优势适合大型应用支持高并发和大数据量功能丰富支持复杂的SQL语句和存储过程生态成熟有丰富的工具和库社区支持有庞大的社区和文档三、PostgreSQL数据库3.1 PostgreSQL简介PostgreSQL是一个功能强大的开源关系型数据库高级特性支持复杂的数据类型和查询可扩展性支持自定义数据类型和函数可靠性具有强大的事务支持和数据完整性开源免费开源软件免费使用3.2 使用psycopg2库需要安装psycopg2库来与PostgreSQL数据库交互# 安装psycopg2 # pip install psycopg2-binary import psycopg2 # 连接到PostgreSQL数据库 conn psycopg2.connect( hostlocalhost, userpostgres, passwordpassword, databasetest, port5432 ) # 创建游标 cursor conn.cursor() # 创建表 cursor.execute( CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, age INTEGER, email VARCHAR(255) UNIQUE ) ) # 插入数据 cursor.execute(INSERT INTO users (name, age, email) VALUES (%s, %s, %s), (Alice, 25, aliceexample.com)) cursor.execute(INSERT INTO users (name, age, email) VALUES (%s, %s, %s), (Bob, 30, bobexample.com)) # 提交事务 conn.commit() # 查询数据 cursor.execute(SELECT * FROM users) rows cursor.fetchall() for row in rows: print(row) # 更新数据 cursor.execute(UPDATE users SET age %s WHERE name %s, (26, Alice)) conn.commit() # 删除数据 cursor.execute(DELETE FROM users WHERE name %s, (Bob,)) conn.commit() # 关闭连接 conn.close()3.3 使用PostgreSQL的优势高级特性支持JSON、数组等复杂数据类型可扩展性支持自定义数据类型和函数可靠性具有强大的事务支持和数据完整性安全性具有强大的安全特性四、使用ORM框架4.1 SQLAlchemySQLAlchemy是一个流行的Python ORM框架# 安装SQLAlchemy # pip install SQLAlchemy from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker # 创建数据库引擎 # SQLite engine create_engine(sqlite:///example.db) # MySQL # engine create_engine(mysqlpymysql://root:passwordlocalhost/test) # PostgreSQL # engine create_engine(postgresql://postgres:passwordlocalhost/test) # 创建基类 Base declarative_base() # 定义模型 class User(Base): __tablename__ users id Column(Integer, primary_keyTrue) name Column(String(255), nullableFalse) age Column(Integer) email Column(String(255), uniqueTrue) # 创建表 Base.metadata.create_all(engine) # 创建会话 Session sessionmaker(bindengine) session Session() # 插入数据 user1 User(nameAlice, age25, emailaliceexample.com) user2 User(nameBob, age30, emailbobexample.com) session.add(user1) session.add(user2) session.commit() # 查询数据 users session.query(User).all() for user in users: print(user.id, user.name, user.age, user.email) # 更新数据 user session.query(User).filter_by(nameAlice).first() user.age 26 session.commit() # 删除数据 user session.query(User).filter_by(nameBob).first() session.delete(user) session.commit() # 关闭会话 session.close()4.2 Django ORMDjango ORM是Django框架内置的ORM# models.py from django.db import models class User(models.Model): name models.CharField(max_length255) age models.IntegerField() email models.EmailField(uniqueTrue) def __str__(self): return self.name # 使用Django ORM # 创建用户 user User.objects.create(nameAlice, age25, emailaliceexample.com) # 查询用户 users User.objects.all() for user in users: print(user) # 更新用户 user User.objects.get(nameAlice) user.age 26 user.save() # 删除用户 user User.objects.get(nameAlice) user.delete()五、数据库连接池5.1 使用连接池对于高并发应用使用连接池可以提高性能# 安装SQLAlchemy # pip install SQLAlchemy from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import QueuePool # 创建带有连接池的引擎 engine create_engine( mysqlpymysql://root:passwordlocalhost/test, poolclassQueuePool, pool_size10, max_overflow20, pool_pre_pingTrue ) # 创建会话 Session sessionmaker(bindengine) session Session() # 使用会话 # ... # 关闭会话 session.close()六、Python与Rust的对比作为一个同时学习Python和Rust的转码者我发现对比学习是一种很好的方法6.1 数据库交互对比Python有丰富的数据库驱动和ORM框架Rust有diesel、sqlx等ORM框架开发效率Python开发效率高Rust开发效率相对较低性能Rust性能优异Python性能相对较低6.2 学习心得Python的优势开发效率高生态丰富Rust的优势性能优异内存安全相互借鉴从Python学习快速开发从Rust学习性能优化七、实践项目推荐7.1 数据库项目用户管理系统实现用户的增删改查博客系统实现文章的发布和管理电商系统实现商品和订单的管理数据分析系统实现数据的存储和分析八、学习方法和技巧8.1 学习方法循序渐进先学习基础的数据库操作再学习高级特性项目实践通过实际项目来巩固知识文档阅读仔细阅读数据库和ORM框架的官方文档社区交流加入社区向他人学习8.2 常见问题和解决方法连接问题检查数据库服务是否运行连接参数是否正确性能问题使用索引优化SQL语句使用连接池安全问题使用参数化查询避免SQL注入数据一致性使用事务确保数据的一致性九、总结Python与数据库的交互是编程中非常重要的一部分。作为一个非科班转码者我深刻体会到学习数据库的重要性。我的学习过程并不是一帆风顺的遇到了很多困难和挫折但通过不断地实践和学习我逐渐掌握了Python与数据库交互的各种技巧。保持学习保持输出。虽然现在我还是个菜鸡但我相信只要坚持总有一天能成为真正的「第一程序员」

更多文章