python操作mysql数据库新手入门

连接数据库

import pymysql

# 打开数据库连接
try:
    db = pymysql.connect(host='localhost', user='root', passwd='root123', port=3306)
    print('连接成功!')
except:
    print('something wrong!')

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

# 使用 execute()  方法执行 SQL 查询
cursor.execute("SELECT VERSION()")

# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()

print("Database version : %s " % data)

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

[root@mytest ~]# python3 conncet.py

连接成功!

Database version : 5.7.41

创建数据库

# 导入pymysql模块
import pymysql
# 连接数据库
db = pymysql.connect(
    host='localhost',      # 数据库主机地址
    user='root',          # 数据库用户名
    password='root123',  # 数据库密码
    port=3306,
    charset='utf8'
)
# 获取游标
cursor = db.cursor()
# 创建pytest库
cursor.execute('CREATE DATABASE IF NOT EXISTS pytest DEFAULT CHARSET utf8 COLLATE utf8_general_ci')
# 关闭游标和数据库连接
cursor.close()
db.close()
print('pytest库创建成功!')

[root@mytest ~]# python3 create_db.py

pytest库创建成功!

创建表

# 导入pymysql模块
import pymysql
# 连接数据库
db = pymysql.connect(
    host='localhost',  # 数据库主机地址
    user='root',  # 数据库用户名
    password='root123',  # 数据库密码
    port=3306,   # 端口,默认为3306
    charset='utf8',  # 编码
    database='pytest'  # 数据库名称
)
# 获取游标
cursor = db.cursor()
# 如果student表存在,则删除
cursor.execute("DROP TABLE IF EXISTS student")
print('删表成功!')
# 创建student表
sql = """CREATE TABLE student (
         id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'id',
         name VARCHAR(20) NOT NULL COMMENT '姓名',
         sex VARCHAR(10) NOT NULL COMMENT '性别',
         age TINYINT NOT NULL COMMENT '年龄',
         class VARCHAR(20) NOT NULL COMMENT '班级',
         grade VARCHAR(20) NOT NULL COMMENT '年级'
         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
cursor.execute(sql)
# 关闭游标和数据库连接
cursor.close()
db.close()
print('student表创建成功!')

[root@mytest ~]# python3 creat_tb.py

student表创建成功!

查询表结构

# 导入pymysql模块
import pymysql
# 连接数据库
db = pymysql.connect(
    host='localhost',  # 数据库主机地址
    user='root',  # 数据库用户名
    password='root123',  # 数据库密码
    database='pytest',  # 数据库名称
    port=3306,  # 数据库端口号
    charset='utf8'  # 数据库编码方式
)
# 获取游标
cursor = db.cursor()
# 查询student表的表结构
sql = "DESCRIBE student"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
    print(row)
# 关闭游标和数据库连接
cursor.close()
db.close()

[root@mytest ~]# python3 desc_tb.py

('id', 'int(11)', 'NO', 'PRI', None, 'auto_increment')

('name', 'varchar(20)', 'NO', '', None, '')

('sex', 'varchar(10)', 'NO', '', None, '')

('age', 'tinyint(4)', 'NO', '', None, '')

('class', 'varchar(20)', 'NO', '', None, '')

('grade', 'varchar(20)', 'NO', '', None, '')

插入10条数据

# 导入pymysql模块
import pymysql
# 连接数据库
db = pymysql.connect(
    host='localhost',  # 数据库主机地址
    user='root',  # 数据库用户名
    password='root123',  # 数据库密码
    port=3306,   # 端口,默认为3306
    charset='utf8',  # 编码
    database='pytest'  # 数据库名称
)
# 获取游标
cursor = db.cursor()
# 向表中插入数据
sql = "INSERT INTO student(name, sex, age, class, grade) VALUES (%s, %s, %s, %s, %s)"
values = [
    ('Tom', 'male', 18, 'class1', 90),
    ('Lucy', 'female', 17, 'class2', 85),
    ('Lily', 'female', 18, 'class1', 92),
    ('Jack', 'male', 18, 'class3', 80),
    ('Bob', 'male', 17, 'class2', 88),
    ('Amy', 'female', 17, 'class3', 82),
    ('Mike', 'male', 18, 'class2', 85),
    ('Mary', 'female', 18, 'class1', 90),
    ('John', 'male', 17, 'class3', 79),
    ('Jane', 'female', 17, 'class2', 92)
]
cursor.executemany(sql, values)
# 提交到数据库执行
db.commit()
print('数据插入成功!')
# 关闭游标和数据库连接
cursor.close()
db.close()

[root@mytest ~]# python3 insert_10.py

数据插入成功!

查询数据

# 导入pymysql模块
import pymysql
# 连接数据库
db = pymysql.connect(
    host='localhost',  # 数据库主机地址
    user='root',  # 数据库用户名
    password='root123',  # 数据库密码
    database='pytest',  # 数据库名称
    port=3306,  # 数据库端口号
    charset='utf8'  # 数据库编码方式
)
# 获取游标
cursor = db.cursor()
# 删除sex不为男或女的数据
# 查询所有数据
sql = "SELECT * FROM student"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
    id = row[0]
    name = row[1]
    sex = row[2]
    age = row[3]
    class_name = row[4]
    grade = row[5]
    print(f"id={id}, name={name}, sex={sex}, age={age}, class={class_name}, grade={grade}")
# 关闭游标和数据库连接
cursor.close()
db.close()

[root@mytest ~]# python3 select_10.py

id=11, name=Tom, sex=male, age=18, class=class1, grade=90

id=12, name=Lucy, sex=female, age=17, class=class2, grade=85

id=13, name=Lily, sex=female, age=18, class=class1, grade=92

id=14, name=Jack, sex=male, age=18, class=class3, grade=80

id=15, name=Bob, sex=male, age=17, class=class2, grade=88

id=16, name=Amy, sex=female, age=17, class=class3, grade=82

id=17, name=Mike, sex=male, age=18, class=class2, grade=85

id=18, name=Mary, sex=female, age=18, class=class1, grade=90

id=19, name=John, sex=male, age=17, class=class3, grade=79

id=20, name=Jane, sex=female, age=17, class=class2, grade=92

批量插入数据

要求往student表中插入总数为10000行数据,批量插入100条数据,提交一次,sleep 1 秒

sex是男或者女,

age在15岁到20岁之间,

class在1班到20班之间,

grade在高一到高三之间,

# 导入pymysql和time模块
import pymysql
import time
# 定义可选的姓名、班级和年级列表
names = ['张三', '李四', '王五', '赵六', '钱七', '周八', '吴九', '郑十', '孙十一', '陈十二']
classes = ['1班', '2班', '3班', '4班', '5班', '6班', '7班', '8班', '9班', '10班', '11班', '12班', '13班', '14班', '15班', '16班', '17班', '18班', '19班', '20班']
grades = ['高一', '高二', '高三']
# 连接数据库
db = pymysql.connect(
    host='localhost',  # 数据库主机地址
    user='root',  # 数据库用户名
    password='root123',  # 数据库密码
    database='pytest',  # 数据库名称
    port=3306,  # 数据库端口号
    charset='utf8'  # 数据库编码方式
)
# 获取游标
cursor = db.cursor()
# 向表中插入数据
sql = "INSERT INTO student(name, sex, age, class, grade) VALUES (%s, %s, %s, %s, %s)"
values = []
for i in range(10000):
    # 随机生成数据
    name = names[i % len(names)] + str(i)  # 避免重复,将姓名和编号拼接
    sex = '男' if i % 2 == 0 else '女'  # 根据编号确定性别
    age = 15 + i % 6  # 根据编号确定年龄
    class_name = classes[i % len(classes)]  # 根据编号确定班级
    grade = grades[i % len(grades)]  # 根据编号确定年级
    # 添加到values列表中
    values.append((name, sex, age, class_name, grade))
    # 每插入100条数据就提交一次
    if i % 100 == 0:
        cursor.executemany(sql, values)
        db.commit()
        time.sleep(1)  # 暂停1秒,避免数据库压力过大
        print(f"已插入{i+1}条数据")
        values = []  # 清空values列表
if values:
    cursor.executemany(sql, values)
    db.commit()
    print(f"已插入{len(values)}条数据")
# 关闭游标和数据库连接
cursor.close()
db.close()

[root@mytest ~]# python3 insert_10000.py

已插入1条数据

已插入101条数据

已插入201条数据

已插入301条数据

已插入401条数据

已插入501条数据

已插入601条数据

已插入701条数据

已插入801条数据

已插入901条数据

已插入1001条数据

。。。。。。

查询表总行数

# 导入pymysql模块
import pymysql
# 连接数据库
db = pymysql.connect(
    host='localhost',  # 数据库主机地址
    user='root',  # 数据库用户名
    password='root123',  # 数据库密码
    database='pytest',  # 数据库名称
    port=3306,  # 数据库端口号
    charset='utf8'  # 数据库编码方式
)
# 获取游标
cursor = db.cursor()
# 查询student表中的行数
sql = "SELECT COUNT(*) FROM student"
cursor.execute(sql)
count = cursor.fetchone()[0]
print(f"student表中共有{count}行数据")
# 关闭游标和数据库连接
cursor.close()
db.close()

[root@mytest ~]# python3 select_count.py

student表中共有10010行数据

分页查询

# 导入pymysql模块
import pymysql
# 连接数据库
db = pymysql.connect(
    host='localhost',  # 数据库主机地址
    user='root',  # 数据库用户名
    password='root123',  # 数据库密码
    database='pytest',  # 数据库名称
    port=3306,  # 数据库端口号
    charset='utf8'  # 数据库编码方式
)
# 获取游标
cursor = db.cursor()
# 查询student表的表结构
sql = "SELECT * FROM student limit 1,10;"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
    print(row)
# 关闭游标和数据库连接
cursor.close()
db.close()

[root@mytest ~]# python3 select_limit.py

(11, 'Tom', 'male', 18, 'class1', '90')

(12, 'Lucy', 'female', 17, 'class2', '85')

(13, 'Lily', 'female', 18, 'class1', '92')

(14, 'Jack', 'male', 18, 'class3', '80')

(15, 'Bob', 'male', 17, 'class2', '88')

(16, 'Amy', 'female', 17, 'class3', '82')

(17, 'Mike', 'male', 18, 'class2', '85')

(18, 'Mary', 'female', 18, 'class1', '90')

(19, 'John', 'male', 17, 'class3', '79')

(20, 'Jane', 'female', 17, 'class2', '92')

批量删除数据

删除student表总id大于8000的数据,每100条删除一次,sleep 0.5秒

# 导入pymysql模块和time模块
import pymysql
import time
# 连接数据库
db = pymysql.connect(
    host='localhost',  # 数据库主机地址
    user='root',  # 数据库用户名
    password='root123',  # 数据库密码
    database='pytest',  # 数据库名称
    port=3306,  # 数据库端口号
    charset='utf8'  # 数据库编码方式
)
# 获取游标
cursor = db.cursor()
# 删除student表中id大于8000的数据,每100条删除一次
start_id = 8001
limit = 100
while True:
    # 构造SQL语句
    sql = f"DELETE FROM student WHERE id>={start_id} AND id<{start_id+limit}"
    # 执行SQL语句
    cursor.execute(sql)
    # 提交事务
    db.commit()
    # 获取删除的行数
    count = cursor.rowcount
    # 打印删除的行数
    print(f"删除了{count}行数据")
    # 如果删除的行数小于100,则说明已经删除完毕,退出循环
    if count < limit:
        break
    # 等待0.5秒
    time.sleep(0.5)
    # 修改start_id的值,准备删除下一批数据
    start_id += limit
# 关闭游标和数据库连接
cursor.close()
db.close()

[root@mytest ~]# python3 delete_100.py

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了100行数据

删除了20行数据

批量修改数据

把student表总id大于6510 而且sex='男'的数据,修改成 sex = '女',每100条修改一次,sleep 1秒

# 导入pymysql模块和time模块
import pymysql
import time
# 连接数据库
db = pymysql.connect(
    host='localhost',  # 数据库主机地址
    user='root',  # 数据库用户名
    passwd='root123',  # 数据库密码
    port=3306,  # 数据库端口号
    charset='utf8',  # 数据库编码方式
    database='pytest'  # 数据库名称
)
# 获取游标
cursor = db.cursor()
# 定义变量
start_id = 6510
limit = 100
# 循环修改数据
while True:
    # 构造SQL语句
    sql = f"UPDATE student SET sex='女' WHERE id>{start_id} AND sex='男' LIMIT {limit}"
    # 执行SQL语句
    cursor.execute(sql)
    # 提交事务
    db.commit()
    # 获取修改的行数
    count = cursor.rowcount
    # 打印修改的行数
    print(f"修改了{count}行数据")
    # 如果修改的行数小于limit,则说明已经修改完毕,退出循环
    if count < limit:
        break
    # 修改start_id的值,准备修改下一批数据
    start_id += limit
    # 等待1秒
    time.sleep(1)
# 关闭游标和数据库连接
cursor.close()
db.close()

[root@mytest ~]# py update_100.py

修改了100行数据

修改了100行数据

修改了100行数据

修改了100行数据

修改了100行数据

修改了100行数据

修改了100行数据

修改了45行数据

修改前:

mysql> select * from student where id > 6510 limit 10;
+------+---------------+-----+-----+-------+--------+
| id   | name          | sex | age | class | grade  |
+------+---------------+-----+-----+-------+--------+
| 6511 | 张三6490      | 男  |  19 | 11班  | 高二   |
| 6512 | 李四6491      | 女  |  20 | 12班  | 高三   |
| 6513 | 王五6492      | 男  |  15 | 13班  | 高一   |
| 6514 | 赵六6493      | 女  |  16 | 14班  | 高二   |
| 6515 | 钱七6494      | 男  |  17 | 15班  | 高三   |
| 6516 | 周八6495      | 女  |  18 | 16班  | 高一   |
| 6517 | 吴九6496      | 男  |  19 | 17班  | 高二   |
| 6518 | 郑十6497      | 女  |  20 | 18班  | 高三   |
| 6519 | 孙十一6498    | 男  |  15 | 19班  | 高一   |
| 6520 | 陈十二6499    | 女  |  16 | 20班  | 高二   |
+------+---------------+-----+-----+-------+--------+

修改后:

mysql> select * from student where id > 6510 limit 10;
+------+---------------+-----+-----+-------+--------+
| id   | name          | sex | age | class | grade  |
+------+---------------+-----+-----+-------+--------+
| 6511 | 张三6490      | 女  |  19 | 11班  | 高二   |
| 6512 | 李四6491      | 女  |  20 | 12班  | 高三   |
| 6513 | 王五6492      | 女  |  15 | 13班  | 高一   |
| 6514 | 赵六6493      | 女  |  16 | 14班  | 高二   |
| 6515 | 钱七6494      | 女  |  17 | 15班  | 高三   |
| 6516 | 周八6495      | 女  |  18 | 16班  | 高一   |
| 6517 | 吴九6496      | 女  |  19 | 17班  | 高二   |
| 6518 | 郑十6497      | 女  |  20 | 18班  | 高三   |
| 6519 | 孙十一6498    | 女  |  15 | 19班  | 高一   |
| 6520 | 陈十二6499    | 女  |  16 | 20班  | 高二   |
+------+---------------+-----+-----+-------+--------+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值