亲,这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到-人的牌一样。所以很多小伙伴就怀疑这...
2025-08-27 0
经过前两章的学习,我们已经成功创建了python_db数据库和users数据表。本章将重点讲解如何通过 Python 向数据表中插入数据,包括单条数据插入、批量数据插入,以及插入过程中的特殊场景处理,同时强调数据一致性的重要性。
在数据库操作中,数据插入是将新记录添加到数据表中的过程,就像在 Excel 表格中新增一行数据。MySQL 通过INSERT语句实现数据插入,而 Python 则通过数据库驱动将INSERT语句发送给 MySQL 服务器执行。
需要注意的是,MySQL 中默认开启了事务机制(后续章节会详细讲解),对于数据插入这类写操作,执行后需要通过commit()方法提交事务,否则数据只会存在于当前连接的临时缓存中,不会真正保存到数据表中。
单条数据插入是最基础的插入场景,适用于每次只添加一条记录的需求,例如用户注册时将新用户信息写入users表。
基础语法如下:
INSERT INTO 表名 (字段1, 字段2, ..., 字段n)
VALUES (值1, 值2, ..., 值n);
其中,字段列表可省略(需按数据表字段定义顺序传入所有字段的值),但为了代码可读性和避免字段顺序变更导致的错误,建议明确指定字段列表。
以下示例将向users表插入一条用户数据(姓名:张三,年龄:25,邮箱:zhangsan@example.com,注册日期:2025-08-22):
import mysql.connector
from mysql.connector import Error
from datetime import date # 用于处理日期类型数据
def insert_single_data():
connection = None
try:
connection = mysql.connector.connect(
host='localhost',
user='root',
password='your_password',
database='python_db'
)
if connection.is_connected():
cursor = connection.cursor()
# 1. 定义插入SQL语句(明确指定字段列表)
insert_query = """
INSERT INTO users (name, age, email, register_date)
VALUES (%s, %s, %s, %s)
"""
# 2. 定义插入的数据(注意:日期类型可直接传入Python的date对象)
user_data = ("张三", 25, "zhangsan@example.com", date(2025, 8, 22))
# 3. 执行插入操作
cursor.execute(insert_query, user_data)
# 4. 提交事务(关键步骤,否则数据不生效)
connection.commit()
print(f"单条数据插入成功,新增记录ID:{cursor.lastrowid}")
# cursor.lastrowid 可获取刚插入记录的自增主键(id)值
except Error as e:
print(f"单条数据插入出错:{e}")
# 若插入失败,回滚事务(避免事务残留)
if connection:
connection.rollback()
finally:
if connection.is_connected():
cursor.close()
connection.close()
print("MySQL连接已关闭")
if __name__ == "__main__":
insert_single_data()
当需要一次性插入多条记录(如批量导入用户数据、批量备份数据)时,批量插入比多次执行单条插入更高效,能显著减少 Python 与 MySQL 服务器的通信次数,提升操作速度。
批量插入只需在VALUES后跟上多组值,用逗号分隔:
INSERT INTO 表名 (字段1, 字段2, ..., 字段n)
VALUES (值1-1, 值1-2, ..., 值1-n),
(值2-1, 值2-2, ..., 值2-n),
...
(值m-1, 值m-2, ..., 值m-n);
以下示例将一次性向users表插入 3 条用户数据:
import mysql.connector
from mysql.connector import Error
from datetime import date
def insert_batch_data():
connection = None
try:
connection = mysql.connector.connect(
host='localhost',
user='root',
password='your_password',
database='python_db'
)
if connection.is_connected():
cursor = connection.cursor()
# 1. 定义批量插入SQL语句
insert_query = """
INSERT INTO users (name, age, email, register_date)
VALUES (%s, %s, %s, %s)
"""
# 2. 定义批量数据(列表嵌套元组,每个元组对应一条记录)
batch_user_data = [
("李四", 28, "lisi@example.com", date(2025, 8, 20)),
("王五", 23, "wangwu@example.com", date(2025, 8, 21)),
("赵六", 30, "zhaoliu@example.com", date(2025, 8, 22))
]
# 3. 执行批量插入(使用executemany()方法)
cursor.executemany(insert_query, batch_user_data)
# 4. 提交事务
connection.commit()
print(f"批量数据插入成功,共新增 {cursor.rowcount} 条记录")
# cursor.rowcount 可获取本次操作影响的记录数
except Error as e:
print(f"批量数据插入出错:{e}")
if connection:
connection.rollback()
finally:
if connection.is_connected():
cursor.close()
connection.close()
print("MySQL连接已关闭")
if __name__ == "__main__":
insert_batch_data()
为了直观展示批量插入的优势,我们对比两种插入 1000 条数据的方式:
插入方式 | 核心方法 | 执行时间(示例) | 优势 |
批量插入 | executemany() | 0.12 秒 | 减少网络通信次数,效率高 |
单条循环插入 | execute () 循环 | 2.8 秒 | 逻辑简单,适用于少量数据 |
显然,数据量越大,批量插入的效率优势越明显。
在实际开发中,数据插入可能会遇到各种特殊情况,如字段值为空、数据重复、日期格式异常等,需要针对性处理。
如果数据表字段未设置NOT NULL约束,允许为空,可在 Python 中传入None表示空值。示例如下:
# 插入一条年龄为空的用户数据(age字段允许为空)
user_data_with_null = ("孙七", None, "sunqi@example.com", date(2025, 8, 23))
cursor.execute(insert_query, user_data_with_null)
connection.commit()
print("含空值数据插入成功")
users表的email字段设置了UNIQUE约束,若插入已存在的邮箱,会触发1062 (23000)错误。可通过INSERT IGNORE或ON DUPLICATE KEY UPDATE解决:
insert_ignore_query = """
INSERT IGNORE INTO users (name, age, email, register_date)
VALUES (%s, %s, %s, %s)
"""
# 插入已存在的邮箱(zhangsan@example.com),会被忽略
cursor.execute(insert_ignore_query, ("张三2", 26, "zhangsan@example.com", date(2025, 8, 24)))
connection.commit()
print("若数据重复则已忽略,无报错")
insert_update_query = """
INSERT INTO users (name, age, email, register_date)
VALUES (%s, %s, %s, %s)
ON DUPLICATE KEY UPDATE name = %s, age = %s, register_date = %s
"""
# 插入已存在的邮箱,若重复则更新姓名、年龄和注册日期
user_data_update = ("张三更新", 27, "zhangsan@example.com", date(2025, 8, 24),
"张三更新", 27, date(2025, 8, 24)) # 后三个参数对应UPDATE的字段值
cursor.execute(insert_update_query, user_data_update)
connection.commit()
print("若数据重复则已更新,无报错")
除了传入date对象,也可传入符合DATE格式(YYYY-MM-DD)的字符串,MySQL 会自动转换为日期类型。但推荐使用date对象,避免字符串格式错误:
# 方式1:传入date对象(推荐)
date_obj = date(2025, 8, 25)
# 方式2:传入符合格式的字符串
date_str = "2025-08-25"
# 两种方式均可正常插入
插入数据后,我们可以通过查询操作验证数据是否成功写入,这也是开发中常用的调试手段。以下示例在插入后查询users表的所有数据:
def insert_and_verify():
connection = None
try:
connection = mysql.connector.connect(
host='localhost',
user='root',
password='your_password',
database='python_db'
)
if connection.is_connected():
cursor = connection.cursor()
# 1. 插入一条数据
insert_query = "INSERT INTO users (name, age, email, register_date) VALUES (%s, %s, %s, %s)"
cursor.execute(insert_query, ("周八", 29, "zhouba@example.com", date(2025, 8, 25)))
connection.commit()
# 2. 查询所有数据验证
select_query = "SELECT * FROM users"
cursor.execute(select_query)
all_users = cursor.fetchall() # 获取所有查询结果
print("插入后users表所有数据:")
# 打印字段名(增强可读性)
field_names = [i[0] for i in cursor.description]
print("\t".join(field_names))
# 打印每条记录
for user in all_users:
print("\t".join(map(str, user)))
except Error as e:
print(f"操作出错:{e}")
if connection:
connection.rollback()
finally:
if connection.is_connected():
cursor.close()
connection.close()
if __name__ == "__main__":
insert_and_verify()
运行后会输出类似以下结果(包含字段名和所有用户记录):
插入后users表所有数据:
id name age email register_date
1 张三 25 zhangsan@example.com 2025-08-22
2 李四 28 lisi@example.com 2025-08-20
3 王五 23 wangwu@example.com 2025-08-21
4 赵六 30 zhaoliu@example.com 2025-08-22
5 孙七 None sunqi@example.com 2025-08-23
6 张三更新 27 zhangsan@example.com 2025-08-24
7 周八 29 zhouba@example.com 2025-08-25
本章我们系统学习了数据插入的核心技能:
下一章将学习数据查询操作,包括基础查询、条件查询、排序查询和分页查询,帮助你从数据表中高效获取所需数据。
相关文章
亲,这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到-人的牌一样。所以很多小伙伴就怀疑这...
2025-08-27 0
今天华为的AI SSD的新品发布会。何为AI SSD?简单地说,就是专为生成式AI 需求打造的固态存储。其实光听这个名字,顾名思义,就暗含了“以存代算...
2025-08-27 0
现在人们打棋牌麻将谁不想赢?手机微乐麻将必赢神器但是手机棋牌麻将是这么好赢的吗?在手机上打棋牌麻将想赢,不仅需要运气,也需要技巧。掌握的棋牌麻将技巧就...
2025-08-27 0
当榆林低空经济从“飞起来”向“用起来”加速迈进,无人机操控员(俗称“飞手”)这一新兴职业正迎来爆发式需求。从前沿技术落地到多元场景应用,从基础设施完善...
2025-08-27 0
时间无声,却刻印着沧海桑田的变化。8月31日至9月1日,2025年上合组织峰会将在天津举行。当24岁的上合组织再“回家”,已经从最初的6个创始成员国发...
2025-08-27 0
发表评论