1. Python有哪些库可以操作Mysql

主要有以下五个库

库名

特点

推荐场景

mysql-connector-python

官方支持,纯 Python 实现

简单项目或快速开发

PyMySQL

轻量级,纯 Python 实现

小型项目

mysqlclient

高性能,C 实现

高并发、性能要求高的项目

SQLAlchemy

ORM 框架

复杂业务逻辑或大型项目

asyncmy

异步支持

高并发异步场景


2. 安装一个Mysql,创建一个库pydb,作为本次练习使用的库

import mysql.connector
from mysql.connector import errorcode

# 配置数据库连接信息
config = {
    'user': 'root',       # 替换为您的MySQL用户名
    'password': '123456',   # 替换为您的MySQL密码
    'host': 'localhost',           # 如果MySQL服务不在本地,请替换为实际的IP地址或主机名
}

try:
    # 尝试连接到MySQL服务器
    cnx = mysql.connector.connect(**config)
    cursor = cnx.cursor()

    # 创建数据库的SQL语句
    create_database_query = "CREATE DATABASE IF NOT EXISTS pydb"

    # 执行创建数据库的操作
    cursor.execute(create_database_query)
    print("数据库 'pydb' 创建成功")

except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("访问被拒绝:检查用户名和密码")
    else:
        print(err)
finally:
    # 关闭游标和连接
    if 'cursor' in locals() and cursor is not None:
        cursor.close()
    if 'cnx' in locals() and cnx is not None:
        cnx.close()


3. 安装Faker库,并说明此库是干啥用的,什么场景下使用

Faker库是一个Python库,用于生成假数据。它可以帮助开发人员生成各种类型的假数据,如姓名、地址、电话号码、公司名称等。这些假数据可以用于测试、开发和数据模拟等场景。


4. 使用for循环调用Faker库,生成10条不重复的中文数据,每条数据中,包含姓名、性别、生日、地址、邮箱、手机号。

from faker import Faker

# 初始化 Faker 实例,并设置为中文环境
fake = Faker('zh_CN')

# 用于存储已生成的数据,确保唯一性
generated_data = set()

# 生成 10 条不重复的中文数据
while len(generated_data) < 10:
    name = fake.name()
    gender = fake.random_element(elements=('男', '女'))
    birthday = fake.date_between(start_date='-30y', end_date='today')
    address = fake.address()
    email = fake.email()
    phone_number = fake.phone_number()

    # 将数据组合成元组,便于检查唯一性
    data_entry = (name, gender, birthday, address, email, phone_number)

    # 如果数据未重复,则添加到集合中
    if data_entry not in generated_data:
        generated_data.add(data_entry)

# 输出生成的数据
for idx, entry in enumerate(generated_data, start=1):
    print(f"第 {idx} 条数据:")
    print(f"姓名: {entry[0]}")
    print(f"性别: {entry[1]}")
    print(f"生日: {entry[2]}")
    print(f"地址: {entry[3]}")
    print(f"邮箱: {entry[4]}")
    print(f"手机号: {entry[5]}")
    print("-" * 40)


5. 创建一个数据表,id为主键自增、其他内容有姓名、性别、生日、地址、邮箱、手机号

import mysql.connector
from mysql.connector import errorcode

# 配置数据库连接信息
config = {
    'user': 'root',       # 替换为您的MySQL用户名
    'password': '123456',   # 替换为您的MySQL密码
    'host': 'localhost',   # 如果MySQL服务不在本地,请替换为实际的IP地址或主机名
    'database': 'pydb'     # 指定要使用的数据库
}

try:
    # 连接到MySQL服务器和指定数据库
    cnx = mysql.connector.connect(**config)
    cursor = cnx.cursor()

    # 创建数据表的SQL语句
    create_table_query = """
    CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        gender ENUM('男', '女') NOT NULL,
        birthday DATE NOT NULL,
        address TEXT NOT NULL,
        email VARCHAR(255) NOT NULL,
        phone VARCHAR(20) NOT NULL
    )
    """

    cursor.execute(create_table_query)
    print("数据表 'users' 创建成功")

except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("访问被拒绝:检查用户名和密码")
    else:
        print(f"发生错误: {err}")
finally:
    # 关闭游标和连接
    if 'cursor' in locals() and cursor is not None:
        cursor.close()
    if 'cnx' in locals() and cnx is not None:
        cnx.close()


6. 使用python中的faker生成随机数据,在上面创建的表中插入10000条数据。

import mysql.connector
from mysql.connector import errorcode
from faker import Faker

# 初始化 Faker 实例,并设置为中文环境
fake = Faker('zh_CN')

# 配置数据库连接信息
config = {
    'user': 'root',       # 替换为您的MySQL用户名
    'password': '123456', # 替换为您的MySQL密码
    'host': 'localhost',  # 如果MySQL服务不在本地,请替换为实际的IP地址或主机名
    'database': 'pydb'    # 指定要使用的数据库
}

try:
    # 连接到MySQL服务器和指定数据库
    cnx = mysql.connector.connect(**config)
    cursor = cnx.cursor()

    # 插入数据的SQL语句
    insert_query = """
    INSERT INTO users (name, gender, birthday, address, email, phone)
    VALUES (%s, %s, %s, %s, %s, %s)
    """

    # 批量生成并插入数据
    batch_size = 1000
    data_batch = []

    for _ in range(10000):
        name = fake.name()
        gender = fake.random_element(elements=('男', '女'))
        birthday = fake.date_between(start_date='-50y', end_date='today')
        address = fake.address()
        email = fake.email()
        phone = fake.phone_number()

        data_batch.append((name, gender, birthday, address, email, phone))

        # 批量提交
        if len(data_batch) == batch_size:
            cursor.executemany(insert_query, data_batch)
            cnx.commit()
            print(f"已插入 {batch_size} 条数据")
            data_batch = []

    # 提交剩余数据
    if data_batch:
        cursor.executemany(insert_query, data_batch)
        cnx.commit()
        print(f"已插入剩余 {len(data_batch)} 条数据")

    print("成功插入 10000 条数据!")

except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("访问被拒绝:检查用户名和密码")
    else:
        print(f"发生错误: {err}")
finally:
    # 关闭游标和连接
    if 'cursor' in locals() and cursor is not None:
        cursor.close()
    if 'cnx' in locals() and cnx is not None:
        cnx.close()


7. 使用python读取数据库中的这些人的信息,并计算这10000人的平均年龄以及最年龄最大的比最小的大几岁。

import mysql.connector
from mysql.connector import errorcode
from datetime import datetime

# 配置数据库连接信息
config = {
    'user': 'root',       # 替换为您的MySQL用户名
    'password': '123456', # 替换为您的MySQL密码
    'host': 'localhost',  # 如果MySQL服务不在本地,请替换为实际的IP地址或主机名
    'database': 'pydb'    # 指定要使用的数据库
}

try:
    # 连接到MySQL服务器和指定数据库
    cnx = mysql.connector.connect(**config)
    cursor = cnx.cursor()

    # 查询所有用户的生日字段
    select_query = "SELECT birthday FROM users"
    cursor.execute(select_query)

    birthdays = [row[0] for row in cursor.fetchall()]

    # 计算当前年份
    current_year = datetime.now().year

    # 将生日转换为年龄
    ages = [current_year - birthdate.year for birthdate in birthdays]

    # 计算统计信息
    average_age = sum(ages) / len(ages)
    max_age = max(ages)
    min_age = min(ages)
    age_diff = max_age - min_age

    # 输出结果
    print(f"平均年龄: {average_age:.2f} 岁")
    print(f"最大年龄: {max_age} 岁")
    print(f"最小年龄: {min_age} 岁")
    print(f"最大年龄比最小年龄大: {age_diff} 岁")

except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("访问被拒绝:检查用户名和密码")
    else:
        print(f"发生错误: {err}")
finally:
    # 关闭游标和连接
    if 'cursor' in locals() and cursor is not None:
        cursor.close()
    if 'cnx' in locals() and cnx is not None:
        cnx.close()


8. 使用python统计这10000人中姓氏最多的前5位的具体数量(可以不考虑复姓)


import json
from collections import Counter

try:
    # 打开并加载 JSON 文件
    with open('data.json', 'r', encoding='utf-8') as file:
        data = json.load(file)

    # 提取所有用户的姓氏(仅取名字的第一个字符)
    surnames = [user['name'][0] for user in data]

    # 统计姓氏出现的次数
    surname_counts = Counter(surnames)

    # 获取出现次数最多的前5个姓氏
    top_5_surnames = surname_counts.most_common(5)

    # 输出结果
    print("姓氏统计 - 前5位:")
    for surname, count in top_5_surnames:
        print(f"姓氏 '{surname}': {count} 次")

except FileNotFoundError:
    print("错误:文件未找到,请检查路径是否正确。")
except json.JSONDecodeError:
    print("错误:文件内容不是有效的 JSON 格式。")
except Exception as e:
    print(f"发生未知错误: {e}")


9. 统计这10000人的属相,只统计数量,以json格式体现,比如
{
"鼠":1224,
...
"猪":968
}

import json
from collections import Counter

# 定义属相列表,按照 12 年周期排列
zodiac_signs = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]

try:
    # 打开并加载 JSON 文件
    with open('data.json', 'r', encoding='utf-8') as file:
        data = json.load(file)

    # 计算每个人的属相,并统计数量
    zodiac_counts = Counter()
    for user in data:
        birth_year = datetime.strptime(user['birthday'], '%Y-%m-%d').year
        zodiac_index = (birth_year - 4) % 12  # 假设 2020 年是“鼠”年
        zodiac = zodiac_signs[zodiac_index]
        zodiac_counts[zodiac] += 1

    # 将结果转换为 JSON 格式并输出
    result_json = json.dumps(dict(zodiac_counts), ensure_ascii=False, indent=2)
    print("属相统计结果(JSON 格式):")
    print(result_json)

except FileNotFoundError:
    print("错误:文件未找到,请检查路径是否正确。")
except json.JSONDecodeError:
    print("错误:文件内容不是有效的 JSON 格式。")
except Exception as e:
    print(f"发生未知错误: {e}")

以他人的幸福为幸福,以他人的享乐为享乐。