首页 > 数据库 >【python】数据库编程

【python】数据库编程

时间:2024-12-04 20:29:00浏览次数:12  
标签:python 数据库 编程 pymysql cursor connection MySQL row

【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

相关文章

  • 拓展01 :代码风格/Python Style
    代码规范关于代码规范,详细内容可以看PEP8这是Python官方对于代码规范的要求。以下我来总结几点重要内容。关于空格使用空格来表示缩进而不要用制表符(Tab)。和语法相关的每一层缩进都用4个空格来表示。每行的字符数不要超过79个字符,如果表达式因太长而占据了多行,除了首......
  • python接入百度智能云API实现ai对话
    python接入百度智能云API实现ai对话千帆大模型平台-百度智能云千帆代码段:importrequestsimportjson#获取访问令牌的函数defget_access_token():#百度AI开放平台的API地址,用于获取access_tokenurl="个人url"#将空字符串转换为JSON格式payload......
  • Python递归
    两个特点:1、调用自身2、结束条件为什么func3打印321而func4打印123的原因(看套娃图理解,大框为func,小框为print)(3从外到内,4从内到外)示例:汉诺塔问题一共n个盘子,把上面的n-1个盘子看成一个整体把n-1个盘子从A经过C移动到B把第n个盘子从A移动到C(移动一步的情况)把n-1个盘子从B......
  • C++多线程之异步编程机制
    在C++11及以后的标准中,std::promise和std::future是用于在异步编程场景中实现线程间通信的重要工具。它们可以用来传递异步操作的结果,或者在任务完成时通知等待的线程。下面我将详细解释std::promise和std::future的实现机制,并提供一些使用场景和示例代码。实现机制std::pro......
  • 2024年华为OD机试真题-数字游戏 -Python-OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述小明玩一个游戏。系......
  • 【前端必读】(一)如何免费无限使用Cursor:AI编程工具的终极指南!
    在当今快速发展的科技时代,AI编程工具如雨后春笋般涌现,其中Cursor凭借其强大的功能和便捷的使用体验,迅速在海外市场引起了热议。最近,这家公司还获得了OpenAI的6000万美元融资,进一步证明了其潜力和市场价值。那么,Cursor究竟有多强大?如何才能免费无限使用它呢?本文将为你揭开Cur......
  • Linux无图形界面环境使用Python+Selenium实践 (转载)
    原文链接:https://developer.aliyun.com/article/1511623简介: 在Linux上使用Selenium和Python来控制浏览器进行自动化测试或者网页数据抓取是常见的需求。本文将介绍如何在Linux无图形界面环境下使用Selenium与Firefox浏览器以headless模式运行,并提供geckodriver、Xvfb和pyvirtu......
  • Java 中几种常用的数据库访问技术
    摘要: 本文深入探讨了Java中几种常用的数据库访问技术,包括JDBC、Hibernate、MyBatis等。详细阐述了每种技术的基本原理、核心组件、使用方法,并通过丰富的示例代码展示了它们在实际应用中的数据库交互操作。通过对这些技术的学习,读者能够全面了解Java与数据库交互的多种途......
  • ESP32+micropython+作为WiFi热点+接收并返回数据
    ESP32+作为WiFi热点+接收并返回数据ESP32代码#ESP32作为AP#作为服务器接收数据并echo#ESP32作为AP即wifi热点importnetworkimportutime#配置ESP32为AP模式ssid='ESP32_AP'password='12345678'authmode=4#WPA2-PSK#创建WLAN对象wlan......
  • Python当中的ParamSpec和TypeVar
    Python当中的ParamSpec和TypeVar内容InPython,thecodesnippet:P=ParamSpec("P")R=TypeVar("R")definestwothingsrelatedtotyping,specificallyforgenericprogramming.Let'sbreakdownwhateachonemeans:1.P=ParamSpec(&qu......