【python】数据库编程
Python 作为一种多功能的编程语言,在数据库操作方面展现出了卓越的灵活性和强大的功能。无论你是初涉编程领域的数据爱好者,还是经验丰富的开发者寻求优化数据库交互方案,本博客都将是你的得力指南。我们将详细讲解如何使用 Python 连接到各种常见的数据库,如 MySQL,并演示如何执行数据的增删改查操作、处理复杂的查询逻辑以及应对数据库事务等重要主题。通过一系列实际案例和清晰的代码解释,你将逐步建立起坚实的 Python 数据库编程基础,能够自信地应对各种数据处理任务,为你的项目开发注入强大的数据动力。
什么是数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。它是一个长期存储在计算机内的、有组织的、可共享的大量数据的集合。这些数据可以是各种各样的信息,如企业的客户信息、员工信息、销售记录,学校的学生信息、课程信息、成绩记录等。
数据结构与组织方式
-
关系型数据库(RDBMS):
关系型数据库是最常见的数据库类型之一。它基于关系模型,使用表(Table)来存储数据。表由行(Row)和列(Column)组成,每一行代表一条记录,每一列代表记录中的一个属性。例如,在一个学生信息表中,行可能代表不同的学生,列可能包括学生的姓名、年龄、性别、学号等属性。
表与表之间可以通过关系(如主键 - 外键关系)进行关联。比如,一个学校数据库可能有学生表、课程表和选课表。选课表中的学生学号字段(外键)可以关联到学生表中的学号字段(主键),课程号字段(外键)可以关联到课程表中的课程号字段(主键),这样就可以表示学生和课程之间的选课关系。 -
非关系型数据库(NoSQL):
非关系型数据库不使用传统的表结构。它有多种数据模型,如键 - 值(Key - Value)存储、文档(Document)存储、列族(Column - Family)存储和图形(Graph)存储等。
键 - 值存储中,数据以键值对的形式存储,就像字典一样。例如,在一个缓存系统中,键可能是一个网页的 URL,值是该网页的内容。文档存储则以文档(通常是 JSON 或 XML 格式)为单位存储数据,适合存储半结构化的数据,如博客文章、用户评论等。列族存储常用于大数据存储,图形存储则用于处理具有复杂关系的数据,如社交网络中的用户关系。 -
数据库管理系统(DBMS)
数据库管理系统是用于管理数据库的软件系统。它提供了一系列的功能来创建、维护和使用数据库。例如:
数据定义语言(DDL)功能:用于定义数据库的结构,包括创建表、修改表结构、删除表等操作。在关系型数据库中,通过 SQL(结构化查询语言)的CREATE TABLE、ALTER TABLE、DROP TABLE等语句来实现这些功能。
数据操纵语言(DML)功能:用于对数据库中的数据进行插入、查询、更新和删除操作。在 SQL 中,对应的语句是INSERT INTO、SELECT、UPDATE和DELETE FROM。
数据控制语言(DCL)功能:用于控制用户对数据库的访问权限,如授予用户访问权限(GRANT语句)或收回权限(REVOKE语句)。
事务管理功能:确保数据库操作的完整性。事务是一组数据库操作,要么全部成功执行,要么全部不执行。例如,在银行转账操作中,从一个账户扣款和向另一个账户收款这两个操作应该作为一个事务来处理,以保证数据的准确性。
数据安全和完整性功能:保护数据库中的数据免受非法访问和损坏。这包括用户认证、数据加密、数据备份和恢复等功能。 -
数据库的用途
数据存储和持久化:可以长期保存大量的数据,避免数据丢失。例如,企业可以将多年的销售数据存储在数据库中,以便进行数据分析和决策。
数据共享和协作:多个用户或应用程序可以同时访问和使用数据库中的数据。例如,在一个企业资源规划(ERP)系统中,不同部门(如销售、采购、生产)的员工可以共享和更新数据库中的客户订单、库存等信息。
数据分析和决策支持:通过对数据库中的数据进行查询、统计和分析,可以为企业、组织或个人提供决策支持。例如,通过分析销售数据来确定最畅销的产品、预测市场趋势等。 -
表(Table)
-
定义:表是关系型数据库中最基本的数据存储结构,是一个二维的数据结构,由行(Row)和列(Column)组成。例如,在一个员工信息表中,每一 行代表一个员工的完整信息,每一列代表员工的一个特定属性,如员工编号、姓名、部门、入职日期等。
-
作用:用于将相关的数据组织在一起,方便进行数据的存储、查询、更新和删除操作。可以把表看作是一个电子表格,但是它具有更严格的数据结构和规则。
-
创建表:(格式)
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
...
);
在关系型数据库中,通常使用 SQL(结构化查询语言)的CREATE TABLE语句来创建表。例如,创建一个简单的学生表可能如下所示:
CREATE TABLE students (
student_id INT PRIMARY KEY,
student_name VARCHAR(50),
age INT,
grade VARCHAR(10)
);
-
行(Row)或记录(Record)
- 定义:表中的一行数据代表一个实体的完整信息,也称为记录。继续以学生表为例,一行数据可能包含一个学生的编号、姓名、年龄和年级等所有信息,这一行数据就构成了对这个学生的完整描述。
- 操作:在数据库操作中,当插入新数据时,是插入一行新的记录;查询数据时,可以根据条件获取特定的行;更新数据时,可以修改某一行中的部分列的值;删除数据时,是删除表中的一行或多行记录。
-
列(Column)或字段(Field)
- 定义:表中的列定义了数据的类型和属性,每一列都有一个名称和数据类型。例如,在学生表中,student_name列的数据类型可能是VARCHAR(可变长度字符串),用来存储学生的姓名;age列的数据类型是INT(整数),用于存储学生的年龄。
- 数据类型:不同的数据库支持不同的数据类型,但常见的数据类型包括整数类型(如INT、BIGINT)、小数类型(如DECIMAL、FLOAT)、字符类型(如CHAR、VARCHAR)、日期时间类型(如DATE、TIME、DATETIME)等。列的数据类型决定了可以存储在该列中的数据的范围和格式。
-
主键(Primary Key)
- 定义:主键是表中的一个或一组列,其值能够唯一地标识表中的每一行记录。例如,在学生表中,student_id列可以作为主键,因为每个学生都有一个唯一的编号。
- 作用:主要用于确保数据的完整性和唯一性,方便对表中的记录进行精确的查询、更新和删除操作。在数据库的关联表操作中,主键也起到关键作用,它可以和外键一起建立表与表之间的关系。
- 特点:主键列的值不能为空(NOT NULL),并且必须是唯一的。一个表只能有一个主键,但主键可以由多个列组成(复合主键)。
-
外键(Foreign Key)
- 定义:外键是一个表中的列,它的值与另一个表中的主键值相对应,用于建两个表之间的关联关系。例如,有一个选课表,其中包含student_id和course_id两个列,student_id可以作为外键关联到学生表的student_id主键列,course_id可以作为外键关联到课程表的course_id主键列,这样选课表就建立了学生和课程之间的关联。
- 作用:维护表之间数据的一致性和完整性。通过外键关系,可以实现级联操作,如当主表中的记录被删除时,可以自动删除从表中与之相关的记录;或者当主表中的主键值更新时,可以自动更新从表中的外键值。
-
索引(Index)
- 定义:索引是一种数据结构,用于提高数据库查询的速度。它就像是一本书的目录,通过索引,数据库可以更快地定位到满足查询条件的数据所在的位置。例如,在一个包含大量员工信息的表中,如果经常根据员工姓名进行查询,那么可以在员工姓名列上创建一个索引。
- 类型:常见的索引类型包括 B - 树索引(B - Tree Index)、哈希索引(Hash Index)等。B - 树索引适用于范围查询和排序操作,哈希索引则适用于等值查询。
MySQL数据库:
广泛应用:许多知名网站和应用使用 MySQL 作为其数据库后端。
高性能:适合处理大规模数据和高并发请求。
灵活性:支持多种存储引擎,如 InnoDB 和 MyISAM。
社区支持:拥有庞大的用户和开发者社区,丰富的文档和资源。
适用场景:需要高性能和高可靠性的企业级应用。
我们这里用的到的也是MySQL数据库
MySQL安装
==我们这里用到的pymysql,是要先安装MySQL数据的.
安装后也是要启动数据库的,不然一样连接不了
数据库官方链接:MySQL
选择适合自己的版本下载即可。(社区版免费)
MySQL Community Edition(社区版):是完全免费的,可自由下载、使用、修改和分发。它包含了大多数常用的功能和特性,能够满足个人开发者、小型企业以及对数据库性能和功能没有特殊要求的用户的基本需求,如数据存储、查询、事务处理和备份等,还包括一些高级功能,如储存过程、触发器、视图等.
MySQL Enterprise Edition(企业版):是商业版本,需要付费购买许可证。该版本为企业用户提供了更强大的功能、工具以及技术支持,收费通常根据用户数量、功能特性、技术支持等方面来确定,适用于对数据库安全、高可用性和性能有更高要求的大型企业,比如提供增强型安全性和审计功能、高可用性和灾难恢复、扩展诊断和监控工具以及优先的技术支持等.
启动 MySQL 数据库
- 通过服务管理器启动:
- 按下 Win + R 组合键,打开 “运行” 对话框。
- 在对话框中输入 “services.msc” 并回车,这将打开 “服务” 窗口。
- 在服务列表中找到 “MySQL” 服务(服务名称可能因 MySQL 版本不同而有所差异,例如可能是 “MySQL80”)。
- 右键单击该服务,选择 “启动” 选项。如果想让 MySQL 服务在计算机开机时自动启动,可以在右键菜单中选择 “属性”,在 “启动类型” 下拉菜单中选择 “自动”,然后点击 “确定”。
找到这个右键启动,关闭也是一样的。
- 通过命令提示符(以管理员身份运行):
- 打开命令提示符,输入 “net start mysql”(这里假设服务名称是 “mysql”,如 果名称不同,需要替换为实际的服务名称),然后回车即可启动 MySQL 服务。
** 启动**
net start mysq 80
停止
net stop mysq 80
pymysql库
pymysql是一个纯 Python 实现的 MySQL 客户端库,它允许 Python 程序与 MySQL 数据库进行交互。它的设计目的是提供一种简单而有效的方式来连接到 MySQL 数据库服务器,执行 SQL 语句,以及处理查询结果。这个库在功能上类似于 MySQLdb(另一个用于 Python 的 MySQL 库),但它具有更好的兼容性,特别是在不支持 MySQLdb 的 Python 环境中(如 Python 3.x 版本,MySQLdb 对 Python 3 的支持有限)。
本文只介绍一下简单的操作,没有那么全面,有需要访问官网查看。
MySQL官方手册:MySQL
pymysql官方手册:pymsql
可以使用 pip 命令来轻松安装 pymysql 库。
pip install pymysql
基础操作
SQL语言基础
创建数据库
- 创建数据库
CREATE DATABASE 数据库名;
drop 命令删除数据库
DROP DATABASE <database_name>; -- 直接删除数据库,不检查是否存在
或
DROP DATABASE [IF EXISTS] <database_name>;
参数说明:
- IF EXISTS 是一个可选的子句,表示如果数据库存在才执行删除操作,避免因为数据库不存在而引发错误。
- database_name 是你要删除的数据库的名称。
注意: 在执行删除数据库操作前,请确保你确实想要删除数据库及其所有数据,因为该操作是不可逆的。为了避免误操作,通常建议在执行删除之前备份数据库。
以下为创建 MySQL 数据表的 SQL 通用语法:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
);
参数说明:
- table_name是你要创建的表的名称。
- column1, , …是表中的列名。column2
- datatype是每个列的数据类型。
以下为删除 MySQL 数据表的通用语法:
DROP TABLE table_name; -- 直接删除表,不检查是否存在
或
DROP TABLE [IF EXISTS] table_name; -- 会检查是否存在,如果存在则删除
参数说明:
- table_name 是要删除的表的名称。
- IF EXISTS 是一个可选的子句,表示如果表存在才执行删除操作,避免因为表不存在而引发错误。
查询数据
基本格式:
SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column_name [ASC | DESC]]
[LIMIT number];
参数说明:
- column1, column2, … 是你想要选择的列的名称,如果使用 * 表示选择所有列。
- table_name 是你要从中查询数据的表的名称。
- WHERE condition 是一个可选的子句,用于指定过滤条件,只返回符合条件的行。
- ORDER BY column_name [ASC | DESC] 是一个可选的子句,用于指定结果集的排序顺序,默认是升序(ASC)。
- LIMIT number 是一个可选的子句,用于限制返回的行数。
以上是一些简单的操作,更多的命令在官网进行查看MySQL
示例
示例 1:接数据库
import pymysql
# 连接数据库的配置参数
config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'test'
}
try:
# 建立连接
connection = pymysql.connect(**config)
# 创建游标
with connection.cursor() as cursor:
# 查询数据库版本
cursor.execute("SELECT VERSION()")
version = cursor.fetchone()
print(f"MySQL 版本: {version[0]}")
except pymysql.Error as e:
print(f"连接数据库失败: {e}")
finally:
# 关闭连接
if connection:
connection.close()
示例 2:创建表
import pymysql
config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'test'
}
try:
connection = pymysql.connect(**config)
with connection.cursor() as cursor:
# 创建表的 SQL 语句
sql = """CREATE TABLE IF NOT EXISTS employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
age INT,
department VARCHAR(255)
)"""
cursor.execute(sql)
# 提交事务,使表创建生效
connection.commit()
except pymysql.Error as e:
print(f"创建表失败: {e}")
# 如果出现错误,回滚事务
if connection:
connection.rollback()
finally:
if connection:
connection.close()
示例 3:插入数据
import pymysql
config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'test'
}
try:
connection = pymysql.connect(**config)
with connection.cursor() as cursor:
# 插入数据的 SQL 语句
sql = "INSERT INTO employees (name, age, department) VALUES (%s, %s, %s)"
data = ('John Doe', 30, 'IT')
cursor.execute(sql, data)
connection.commit()
except pymysql.Error as e:
print(f"插入数据失败: {e}")
if connection:
connection.rollback()
finally:
if connection:
connection.close()
示例 4:查询数据并打印结果
import pymysql
config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'test'
}
try:
connection = pymysql.connect(**config)
with connection.cursor() as cursor:
# 查询数据的 SQL 语句
sql = "SELECT * FROM employees"
cursor.execute(sql)
# 获取所有查询结果
results = cursor.fetchall()
for row in results:
print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}, Department: {row[3]}")
except pymysql.Error as e:
print(f"查询数据失败: {e}")
finally:
if connection:
connection.close()
示例 4:查询数据并打印结果
import pymysql
config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'test'
}
try:
connection = pymysql.connect(**config)
with connection.cursor() as cursor:
# 查询数据的 SQL 语句
sql = "SELECT * FROM employees"
cursor.execute(sql)
# 获取所有查询结果
results = cursor.fetchall()
for row in results:
print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}, Department: {row[3]}")
except pymysql.Error as e:
print(f"查询数据失败: {e}")
finally:
if connection:
connection.close()
示例 5:更新数据
import pymysql
config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'test'
}
try:
connection = pymysql.connect(**config)
with connection.cursor() as cursor:
# 更新数据的 SQL 语句
sql = "UPDATE employees SET age = %s WHERE name = %s"
data = (35, 'John Doe')
cursor.execute(sql, data)
connection.commit()
except pymysql.Error as e:
print(f"更新数据失败: {e}")
if connection:
connection.rollback()
finally:
if connection:
connection.close()
示例 6:删除数据
import pymysql
config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'test'
}
try:
connection = pymysql.connect(**config)
with connection.cursor() as cursor:
# 删除数据的 SQL 语句
sql = "DELETE FROM employees WHERE name = %s"
data = ('John Doe',)
cursor.execute(sql, data)
connection.commit()
except pymysql.Error as e:
print(f"删除数据失败: {e}")
if connection:
connection.rollback()
finally:
if connection:
connection.close()
示例 7:使用 WHERE 子句进行条件查询
import pymysql
config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'test'
}
try:
connection = pymysql.connect(**config)
with connection.cursor() as cursor:
# 条件查询的 SQL 语句
sql = "SELECT * FROM employees WHERE age > %s"
data = (25,)
cursor.execute(sql, data)
results = cursor.fetchall()
for row in results:
print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}, Department: {row[3]}")
except pymysql.Error as e:
print(f"条件查询失败: {e}")
finally:
if connection:
connection.close()
示例 8:使用 ORDER BY 对查询结果排序
import pymysql
config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'test'
}
try:
connection = pymysql.connect(**config)
with connection.cursor() as cursor:
# 排序查询的 SQL 语句
sql = "SELECT * FROM employees ORDER BY age DESC"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}, Department: {row[3]}")
except pymysql.Error as e:
print(f"排序查询失败: {e}")
finally:
if connection:
connection.close()
示例 9:使用 LIMIT 限制查询结果数量
import pymysql
config = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'test'
}
try:
connection = pymysql.connect(**config)
with connection.cursor() as cursor:
# 限制查询结果数量的 SQL 语句
sql = "SELECT * FROM employees LIMIT 3"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}, Department: {row[3]}")
except pymysql.Error as e:
print(f"限制查询失败: {e}")
finally:
if connection:
connection.close()
标签:python,数据库,编程,pymysql,cursor,connection,MySQL,row
From: https://blog.csdn.net/2303_81251774/article/details/144242825