跳至主要内容

MySQL in Python 教程:入门指南

在本教程中,您将学习如何安装 MySQL、创建数据库和数据表,以及更多内容。
· 13分钟 阅读

使用 AI 探索

MySQL 是一种采用客户端-服务器模型的关系型数据库管理系统(RDBMS)。这意味着想要访问数据的计算机(“客户端”)必须连接到 RDBMS 服务器才能进行操作。 

另一方面,Python 是一种流行的高级通用编程语言。开发者经常使用它来构建网站与软件、自动化任务以及分析数据。它还可以与多种数据库配合使用,包括 MySQL。Python 支持数据查询语句、数据定义语言和数据操作。本教程将向您展示如何在 Python 中使用 MySQL。 

在 Python 中开始使用 MySQL

要在您的 DataCamp 工作空间中通过 Python 使用 MySQL,您必须使用 工作空间集成来连接到现有的托管数据库。我们将在本教程中从零开始构建数据库,因此不会使用 DataCamp 工作空间。 

要跟随本教程,您需要完成以下两步: 

  1. 安装 MySQL 服务器,以提供管理数据库所需的服务。您可以从 MySQL 官网下载并安装。
  2. 安装 MySQL 连接器,它是一个 Python 驱动程序,可帮助您将 Python 应用集成到 MySQL 数据库;可通过 pip(Python 的包管理器)直接安装。

安装完 MySQL 服务器后: 

  1. 将此 GitHub 仓库克隆到本地计算机——如何在 Github 上克隆仓库。
  2. 创建并激活虚拟环境——创建虚拟环境。
  3. 在终端中使用 pip install -r requirements 安装所需依赖包。  
  4. 在根目录创建一个 .env 文件。
    1. 将用于与 MySQL 服务器进行用户认证的密码,存储在名为 PASSWORD 的变量中——如果您未设置 root 密码,则服务器不需要密码。  

免责声明

在该 仓库中的每个文件名前缀都有一个数字,用于指示其在本教程中的顺序。

例如,04_data_insertion.py 表示该模块应在第 4 步运行(在 01 - 03 之后)。您也可以通过运行 00_execute_all.py 来执行全部代码。

建立连接

MySQL 遵循服务器-客户端模型;每当客户端想要访问数据时,必须连接到 RDBMS。 

与服务器建立连接的方式,是使用 mysql.connector 模块中的 connect() 方法…

import os

from mysql import connector
from dotenv import load_dotenv


load_dotenv()
PASSWORD = os.getenv("PASSWORD")

try:
    with connector.connect(
        host = "localhost",
        user = "root",
        password = PASSWORD
    ) as database:
        print(database)
except connector.Error as e:
    print(e)

"""
<mysql.connector.connection_cext.CMySQLConnection object at 0x00000188FA653970>
"""

在 connect() 方法的完整参数范围请参阅 文档。 

关于这段代码,有三点需要注意: 

  1. 异常与错误处理:在与 MySQL 服务器建立连接时进行错误处理是一个良好实践。 
  2. 关闭连接:我们使用了上下文管理器,因此未显式调用 close() 方法来关闭连接。一般而言,完成数据库访问后必须关闭连接,以防出现意外错误。 
  3. 敏感数据:使用环境变量来隐藏敏感信息,因为共享它会带来安全风险。 

现在,您已经在 Python 程序与 MySQL 服务器之间建立了连接,可以连接到服务器上可能存在的众多数据库之一。当前我们尚无任何数据库;这意味着我们需要在服务器中创建一个新数据库。下一节来看看如何实现。 

注意: 每次访问数据库时,都必须与服务器建立连接。在后续代码示例中,我们将移除此部分以避免在整个教程中重复。然而,它已包含在代码库中。

使用 Python 在 MySQL 中创建新数据库

接下来您需要用到 SQL 技能;DataCamp 的《SQL 入门》课程是不错的起点,可帮助您快速上手。 

在 MySQL 中创建数据库的典型方式如下: 

CREATE DATABASE book_ratings;

要在 Python 中执行相同的查询,您必须创建一个 cursor() 对象的实例。 

从 cursor() 对象中,您可以将 SQL 命令作为字符串传递给 execute() 方法,以执行代码。 

让我们创建一个名为“book_ratings”的数据库…

create_db = "CREATE DATABASE book_ratings"
with database.cursor() as cursor:
    cursor.execute(create_db)

注意: 多次运行此代码将引发错误,提示该数据库已存在。

您可以如下检查服务器上已存在的数据库:

show_existing_db = "SHOW DATABASES"

with database.cursor() as cursor: 
    cursor.execute(show_existing_db)
    for db in cursor:
        print(db)

"""
('book_ratings',)
('information_schema',)
('mysql',)
('performance_schema',)
('sakila',)
('sys',)
('world',)
"""

上述代码输出了当前 MySQL 服务器中所有数据库的名称。不止一个数据库是因为 MySQL 服务器会自动生成一些数据库,以提供对各种数据库元数据和服务器设置的访问。

连接到现有数据库

假设您已经创建了一个数据库,但尚未连接到服务器;如何直接连接到该数据库? 

很简单。 

将数据库名称作为参数传递给 connect() 方法即可:

try:
    with connector.connect(
        host = "localhost",
        user = "root",
        password = PASSWORD,
        database = "book_ratings"
    ) as database:
       
        print(database})

except connector.Error as e:
    print(e)

"""
<mysql.connector.connection_cext.CMySQLConnection object at 0x0000016DD8C24970>
"""

创建数据表

数据库中的信息存储在表中。表是一种用于存放相关数据集合的格式,由列和行组成。 

一个数据库中可以包含多个表,即使它们彼此无关。在本节中我们也可以只用一个表来构成关系型数据库——您可以通过 《SQL 关系型数据库入门》课程来拓展相关知识。 

创建表的步骤与您已看到的非常相似: 

  • 将 SQL 命令写成字符串
  • 将其传递给游标对象的 execute() 方法。 

此处使用的 SQL 语句是 CREATE TABLE。

让我们用它来创建一个图书表:

create_books_table = """
CREATE TABLE books(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100),
    author VARCHAR(100),
    genre VARCHAR(100),
    release_year YEAR(4)
)
"""
# Create cursor object
with existing_database.cursor() as cursor:
    cursor.execute(create_books_table)
    existing_database.commit()

您可能注意到在代码的最后一行,我们对 existing_database 对象调用了 commit() 方法。之所以这样做,是因为 MySQL 的 Python 连接器默认不会自动提交事务。 

每当您修改表中的数据时,都必须调用 commit() 方法——在 MySQL 文档中了解更多有关 commit() 的信息。 

代码中还有一些其他重要点: 

  • NOT NULL:一种约束,用于强制列不接受 NULL 值。 
  • PRIMARY KEY:用于标识表中特定行的唯一值。 
  • AUTO_INCREMENT:为插入到表中的新记录自动生成唯一编号。 

我们可以使用 DESCRIBE 语句,并在游标对象上使用 fetchall() 方法打印所有元素,来检查模式是否创建正确…

describe_books = "DESCRIBE books"
with existing_database.cursor() as cursor:
    cursor.execute(describe_books)
    books_schema = cursor.fetchall()
    for column in books_schema:
        print(column)

"""
('id', b'int', 'NO', 'PRI', None, 'auto_increment')
('title', b'varchar(100)', 'YES', '', None, '')
('author', b'varchar(100)', 'YES', '', None, '')
('genre', b'varchar(100)', 'YES', '', None, '')
('release_year', b'year', 'YES', '', None, '')
"""

数据插入

在之前的章节中,我们在 book_ratings 数据库中创建了一个名为 books 的表。目前,该表为空。下一节将介绍两种可用于填充表的数据插入方式。 

插入单条记录

有时您可能需要向表中插入单条记录。尽管在真实场景中较少见,但您仍可按如下方式实现:

# INSERT SINGLE RECORD
insert_single_record = "INSERT INTO books (id, title, author, genre, release_year)\
    VALUES (%s, %s, %s, %s, %s)"
single_record = (
    "1", "Choose Yourself! Be Happy, Make Millions, Live the Dream", "James Altucher", "self-help", "2013"
    )

# Create cursor object
with existing_database.cursor() as cursor:
    cursor.execute(insert_single_record, single_record)
    existing_database.commit()

插入多条记录

更常见的插入数据方式,是使用游标对象的 executemany(operation_to_perform, seq_of_params) 方法;它允许您一次插入多条记录。 

要执行的操作结构保持不变;我们只需更新参数序列。 

代码如下: 

multiple_records = [
    (
        "2",
        "Skip the Line: The 10,000 Experiments Rule and Other Surprising Advice for Reaching Your Goals",
        "James Altucher",
        "self-help",
        "2021"        
    ),
    (
        "3",
        "The Power of No: Because One Little Word Can Bring Health, Abundance, and Happiness",
        "James Altucher",
        "self-help",
        "2014"
    ),
    ]

with existing_database.cursor() as cursor:
    cursor.executemany(insert_multiple_records, multiple_records)
    existing_database.commit()

数据选择 

SELECT 语句用于从数据库中的一个或多个表中检索所选行。我们可以通过以下两种方式使用 SELECT: 

  1. 从表中选择特定列。
select_specific_cols = "SELECT author, release_year FROM books"
with existing_database.cursor() as cursor:
    cursor.execute(select_specific_cols)
  1. 使用星号“*”返回所有列
# Create cursor object
select_all_cols = "SELECT * FROM books"
with existing_database.cursor() as cursor:
    cursor.execute(select_all_cols)

数据排序与筛选 

排序和筛选数据可以通过提供特定条件,让您仅返回所需的结果。 

以下是一些示例: 

WHERE

WHERE 子句允许您基于指定条件筛选数据。 

例如,假设我们想要提取所有在 2010 年及之前出版的图书的作者名和书名: 

condition = "SELECT author, title FROM books WHERE release_year <= 2010"
with existing_database.cursor() as cursor:
    cursor.execute(condition)

ORDER BY

我们还可以使用 ORDER BY 子句按升序(ASC)或降序(DESC)对结果进行排序。请注意,默认模式始终为升序,除非您显式指定其他方式。 

以下是按出版年份降序排列数据的写法:

order_by_year = "SELECT * FROM books ORDER BY release_year DESC"
with existing_database.cursor() as cursor:
    cursor.execute(order_by_year)

LIMIT

LIMIT 子句允许您指定结果集中要返回的记录数量。

# Create cursor object
define_limit = "SELECT * FROM books LIMIT 3"
with existing_database.cursor() as cursor:
    cursor.execute(define_limit)

上述代码将返回的记录数量限制为三条。 

数据更新与删除

有时数据会发生变化、不再有用或存在错误。本节将介绍如何通过更新和删除来处理这些情况。 

UPDATE

UPDATE 查询使您能够在不影响表结构的情况下更改表中的现有值。 

例如,如果某人更改了姓名,您可能需要更新记录;代码如下:

update_query = """
UPDATE
    books
SET
    author = "Big J"
WHERE
    author = "James Altucher"
"""
with existing_database.cursor() as cursor:
    cursor.execute(update_query)
    existing_database.commit()

DELETE

DELETE 查询允许您从表中删除记录:

drop_record = "DELETE FROM books WHERE release_year <= 2000"
with existing_database.cursor() as cursor:
    cursor.execute(drop_record)
    existing_database.commit()

在这段代码中,我们删除了所有出版年份小于或等于 2000 年的记录。 

DROP TABLE

DROP TABLE 语句允许您永久从数据库中移除一个表。添加 IF EXISTS 可应对您不确定要删除的表是否存在的情况,但它完全是可选的。 

让我们删除在 book_ratings 数据库中创建的表: 

drop_table = "DROP TABLE IF EXISTS books"
with existing_database.cursor() as cursor:
    cursor.execute(drop_table)
    existing_database.commit()

结语

在本教程中,您学习了如何在 Python 中与 MySQL 服务器建立连接、创建新数据库、连接到现有数据库、创建数据表,并从 Python 对 MySQL 表执行各种查询操作。  

继续学习,您可以参考以下资源:

主题