Python中pymysql模块操作MySQL数据库(第2节)


pymysql模块是Python连接MySQL数据库的常用库。通过pymysql模块,我们可以轻松地与MySQL数据库进行交互,执行SQL查询和操作数据。

1、创建数据库表

在上一节教程中,我们已经详细介绍了如何通过pymysql模块连接MySQL数据库,接下来我们在“pyhint”数据库中创建一张名为“users”的表,并定义三个列:id、name和age。例如:

动手练一练:

import pprint
# 导入pymysql模块
import pymysql

# 创建connect对象,建立数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="pyhint")

# 创建游标对象
cursor = db.cursor()

# 使用execute()方法执行SQL语句,创建一张“users”表
sql = """
create table users (
    id int(6) unsigned auto_increment primary key,
    name varchar(30) not null,
    age int(3) not null
);
"""
cursor.execute(sql)

# 查询我们刚创建的新表结构
cursor.execute("desc users")
content = cursor.fetchall()

# pprint()采用分行打印输出
pprint.pprint(content)

# 关闭游标,释放资源
cursor.close()

# 关闭数据库连接
db.close()

执行以上代码,输出结果为:

(('id', 'int unsigned', 'NO', 'PRI', None, 'auto_increment'),
('name', 'varchar(30)', 'NO', '', None, ''),
('age', 'int', 'NO', '', None, ''))

上面的例子中,我们通过“create table”指令创建了一张名为“users”的表,再通过“desc users”指令可以查看“users”表的结构。

2、数据库插入数据

通过pymysql模块向数据库插入数据和创建数据库表的方式基本相同,我们可以使用“insert into”语句将数据插入到表中。这里需要注意的是,最后必须调用commit()方法来提交对数据库的修改,否则修改的结果不会被真正保存到数据库中。例如:

动手练一练:

# 导入pymysql模块
import pymysql

# 创建connect对象,建立数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="pyhint")

# 创建游标对象
cursor = db.cursor()

# 使用预处理语句插入数据
sql = """
insert into users (name, age)
values ('许某', 20), ('陈某', 22), ('林某', 18);
"""

try:
    # 执行sql语句,并返回受影响的行数
    row_count = cursor.execute(sql)
    # 提交到数据库执行
    db.commit()
    # 打印结果
    print(f'受影响的行数:{row_count}')
except Exception as e: 
    # 如果发生错误则回滚
    db.rollback()

# 关闭游标,释放资源
cursor.close()

# 关闭数据库连接
db.close()

执行以上代码,输出结果为:

受影响的行数3

上面的例子中,使用cursor.execute()方法来执行SQL语句,并返回插入的行数。当更改表中数据时(包括插入、更新、删除),必须调用commit()方法来提交更改,否则数据库表中的数据不会发生改变。此过程如果出现异常,则使用rollback()回滚方法使数据库恢复到执行SQL语句之前的状态。

3、查询数据

查询数据是操作数据库最常见的需求之一。前面我们已经通过pymysql模块向“users”表中插入了三条数据,接下来可以使用“select”语句来查询数据,并使用fetchone()方法获取单条数据, 也可以使用fetchall()方法获取全部的数据。例如:

动手练一练:

# 导入pymysql模块
import pymysql

# 创建connect对象,建立数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="pyhint")

# 创建游标对象
cursor = db.cursor()

# 使用execute()方法执行SQL语句
sql = """
select * from users;
"""
cursor.execute(sql)

# 使用fetchone()方法获取单条数据
content = cursor.fetchone()
print(f"单条数据:{content}")

# 重新执行SQL语句
cursor.execute(sql)

print("所有的查询结果:")

# 使用fetchall()方法获取所有的查询结果
result = cursor.fetchall()
# 遍历所有的数据
for row in result:
    print(row)

# 关闭游标,释放资源
cursor.close()

# 关闭数据库连接
db.close()

执行以上代码,输出结果为:

单条数据(1, '许某', 20)
所有的查询结果:
(1, '许某', 20)
(2, '陈某', 22)
(3, '林某', 18)

上面的例子中,我们首先执行了一个SQL查询语句,然后通过fetchall()方法获取了所有的查询结果。这个函数返回一个元组列表,列表中每个元组对应查询结果中的一行记录。然后我们使用“for”循环语句遍历了这个列表,打印出了每行记录。

4、更新数据

通过pymysql模块更新数据表的数据和插入数据类似,更新MySQL数据需要使用“update”语句,在修改完成之后同样需要调用commit()方法将更改提交到数据库。例如:

动手练一练:

# 导入pymysql模块
import pymysql

# 创建connect对象,建立数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="pyhint")

# 创建游标对象
cursor = db.cursor()

# 查询所有数据,返回数据为元组格式
cursor.execute("select * from users;")

# 使用fetchall()方法获取所有的查询结果
result = cursor.fetchall()
print("更新前:", result)

# 使用预处理语句插入数据
sql = """
update users set age = 15 where id = 1;
"""

try:
    # 执行sql语句
    cursor.execute(sql)
    # 提交到数据库执行
    db.commit()
except Exception as e: 
    # 如果发生错误则回滚
    db.rollback()

# 查询所有数据,返回数据为元组格式
cursor.execute("select * from users;")

# 使用fetchall()方法获取所有的查询结果
result = cursor.fetchall()
print("更新后:", result)

# 关闭游标,释放资源
cursor.close()

# 关闭数据库连接
db.close()

执行以上代码,输出结果为:

更新前 ((1, '许某', 20), (2, '陈某', 22), (3, '林某', 18))
更新后 ((1, '许某', 15), (2, '陈某', 22), (3, '林某', 18))

5、删除数据

通过pymysql模块删除MySQL数据需要使用“delete”语句,操作完成后,同样必须调用commit()方法将更改提交到数据库。例如:

动手练一练:

# 导入pymysql模块
import pymysql

# 创建connect对象,建立数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="pyhint")

# 创建游标对象
cursor = db.cursor()

# 查询所有数据,返回数据为元组格式
cursor.execute("select * from users;")

# 使用fetchall()方法获取所有的查询结果
result = cursor.fetchall()
print("删除前:", result)

# 使用预处理语句插入数据
sql = """
delete from users where id = 3;
"""

try:
    # 执行sql语句
    cursor.execute(sql)
    # 提交到数据库执行
    db.commit()
except Exception as e: 
    # 如果发生错误则回滚
    db.rollback()

# 查询所有数据,返回数据为元组格式
cursor.execute("select * from users;")

# 使用fetchall()方法获取所有的查询结果
result = cursor.fetchall()
print("删除后:", result)

# 关闭游标,释放资源
cursor.close()

# 关闭数据库连接
db.close()

执行以上代码,输出结果为:

删除前 ((1, '许某', 15), (2, '陈某', 22), (3, '林某', 18))
删除后 ((1, '许某', 15), (2, '陈某', 22))