Bootstrap

MySQL win安装 和 pymysql使用示例

目录

一、MySQL安装

下载压缩包:

编写配置文件: 

配置环境变量:

初始化服务和账户

关闭mysql开机自启(可选) 

建议找一个数据库可视化软件

二、使用pymysql操作数据库

安装pymysql

示例代码

报错处理


一、MySQL安装

下载压缩包:

MySQL :: Download MySQL Community Server

进入上述网址,默认是最新版,我们下载第二项,压缩包。

下载后解压

编写配置文件: 

在解压出来的文件夹中创建my.ini配置文件,文件内容如下:

[mysqld]  
#设置 3306 端口  
port = 3306  

# 设置 mysql 的安装目录  
basedir= D:\mysql-9.1.0-winx64

# 设置 mysql 数据库的数据的存放目录  
datadir= D:\mysql-9.1.0-winx64\data  

# 允许最大连接数  
max_connections=200  

# 创建新表时将使用的默认存储引擎  
default-storage-engine=INNODB

# 服务端使用的字符集默认为 8 比特编码的 latin1 字符集  
character-set-server=utf8  

配置环境变量:

在系统变量中添加MYSQL_HOME项目值为你的mysql文件夹位置,

比如我的是D:\mysql-9.1.0-winx64

 然后向Path中添加一条值:%MYSQL_HOME%\bin

初始化服务和账户

使用管理员cmd,进入该文件夹下的bin目录。 执行:mysqld install

显示Service successfully installed.即成功安装mySQL服务。

使用mysqld --initialize-insecure 命令生成无密码的root用户,

使用net start mysql即可启动mysql服务。

接下来设置用户密码,依次输入下面四条命令:

mysql -uroot

create user 'test'@'localhost' identified by 'mysql';

grant all privileges on *.* to test@'localhost';

exit

第一条是用root用户登录,由于之前没设置root用户密码,所以无需密码,

第二条是创建本地用户,用户名为 test,密码为mysql(你可以换成别的名字和密码)

第三条是赋予该用户所有权限

最后一条是关闭MySQL监视器

 接下来以test登录,修改root密码:

mysql -utest -pmysql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysql';
FLUSH PRIVILEGES;
EXIT;
mysql -uroot -pmysql

成功以密码登录root。

关闭mysql开机自启(可选) 

直接在搜索框搜索‘服务’,在服务中找到mysql,右键-属性,将启动类型改为手动。

建议找一个数据库可视化软件

        我使用的数据库可视化软件:Navicat Premium,需要付费,网上有白嫖教程,这就不说了。

二、使用pymysql操作数据库

安装pymysql

 首先使用以下命令或者其他你喜欢的方式安装pymysql:

pip install pymysql

示例代码

现在我们就能使用pymysql操作数据库了,先尝试运行下面代码, 

import pymysql

database_name = 'testmysql'
delete_database = True  # 删库
# delete_database = False  # 不删库

connection = pymysql.connect(  # 建立链接
    host='localhost',  # 主机位置(本地)
    port=3306,  # 端口
    user='test',  # 用户名
    password='mysql',  # 密码
    charset='utf8mb4',  # 字符集
    # database=database_name,  # 数据库名
)

# 创建数据库‘testmysql’,IF NOT EXISTS 如果不存在才执行
create_database_sql = f'CREATE DATABASE IF NOT EXISTS {database_name};'
show_sql = 'SHOW databases'  # 查询数据库
goto_database = f'USE {database_name}'  # 选择操作的数据库

# 创建班级表
create_table_Classes_sql = '''
CREATE TABLE IF NOT EXISTS 班级 (             -- 创建Classes表(班级)
    班号 INT AUTO_INCREMENT PRIMARY KEY,      -- 班级id int 自动递增 且为主键,主键自动递增比较好管理
    班名 VARCHAR(100) NOT NULL,               -- 班名 可变长字符串,不能为空
    班导 VARCHAR(100)                         -- 班主任 可空(让我想起了当年一学年换5次班主任)
);
'''
# 创建学生表
create_table_Students_sql = '''
CREATE TABLE IF NOT EXISTS 学生 (                     -- 创建Students表(学生)
    学号 INT AUTO_INCREMENT PRIMARY KEY,              -- 学号 int 自动递增 且为主键
    姓名 VARCHAR(100) NOT NULL,                       -- 学生名 可变长字符串,不能为空
    性别 ENUM('男', '女', '其他','直升机') NOT NULL,    -- 枚举类型的性别
    民族 VARCHAR(50),
    班级 INT,          -- 班级为外键,注意ON DELETE CASCADE表示级联删除,班没了学生外键班级也会删除,
                        -- CASCADE ON UPDATE CASCADE 表示级联更新,班号要是改了,这里也会同步更改
    FOREIGN KEY (班级) REFERENCES 班级(班号) ON DELETE CASCADE ON UPDATE CASCADE
);
'''
delete_database_sql = f'DROP DATABASE IF EXISTS {database_name};'  # 若存在,删库(删库跑路)

try:
    with connection.cursor() as cursor:  # 创建游标对象
        cursor.execute(show_sql)  # 执行 查询 sql语句
        all_database_name = cursor.fetchall()  # 获取查询所有行
        if not (database_name,) in all_database_name:  # 返回了元组所以需要包装一下
        # if True:
            # 建库===================================================================
            cursor.execute(create_database_sql)  # 执行 创建 sql语句
            cursor.execute(show_sql)  # 查看创建好了没(有问题一般就报错了,通常不用看)
            all_database_name = cursor.fetchall()
            if (database_name,) in all_database_name:
                print('数据库创建完成')
            cursor.execute(goto_database)  # 选择操作的数据库
            # 建表===================================================================
            cursor.execute(create_table_Classes_sql)
            cursor.execute(create_table_Students_sql)
            # connection.commit()  # 建库,建表都会隐式提交,不需要写提交事务语句,同时也无法回滚
            # 增===================================================================
            insert_Class_sql = '''
                INSERT INTO 班级 (班名, 班导) VALUES (%s, %s),(%s, %s),(%s, %s)
            '''
            data_Class = ['日升班', '道光', '伏流班', '汪洋', '腾渊班', '菲杨']
            cursor.execute(insert_Class_sql, data_Class)
            insert_Students_sql = '''
                INSERT INTO 学生 (姓名, 性别,民族,班级) VALUES (%s, %s, %s, %s)
            '''
            name = ['赵匡胤', '钱镠', '孙悟空', '武曌', '曹雪芹', '杰瑞', '张三', '约翰·纳什', '武直-10']
            sex0 = ['男', '男', '男', '女', '男', '其他', '男', '男', '直升机']  # 枚举类型,如果填别的会报错
            nati = ['汉', '汉', '汉', '汉', '满', '米奇', '汉', '维京', '中华民族']
            clas = [2, 3, 3, 2, 1, 1, 1, 2, 3]  # 注意,因为主键自动递增控制,所以,初始设置的三个班主键分别为1,2,3
            data = [[name[i], sex0[i], nati[i], clas[i], ] for i in range(len(name))]
            cursor.executemany(insert_Students_sql, data)
            connection.commit()  # 通常来说,事件全完成再提交,这里是为了方便打断点看
            # 删===================================================================
            # 听说,生产环境中不删数据,只设置一个变量,查询不显示。
            delete_sql = 'DELETE FROM 学生 WHERE 姓名=%s;'  # 删掉学生:杰瑞
            cursor.execute(delete_sql, '杰瑞')
            # cursor.execute(delete_sql, ('杰瑞',))   # 一个参数没什么格式要求
            # cursor.execute(delete_sql, (('杰瑞'),))
            connection.commit()
            # 改===================================================================
            change_sql = 'UPDATE 学生 SET 性别 = %s,民族 = %s WHERE 姓名 = %s;'  # 悟空天生地养,无族无性
            cursor.executemany(change_sql, (('其他', None, '孙悟空'),))
            # cursor.executemany(change_sql, [['其他', None, '孙悟空']])  # 列表也行
            connection.commit()
            # 查===================================================================
            select_classes_sql = 'SELECT * FROM 班级'  # 显示所有班级
            cursor.execute(select_classes_sql)
            classes = cursor.fetchall()
            print('班级有:')
            for class_info in classes:
                print(class_info)
            # 跨表方式1
            select_students_sql = '''
                SELECT * FROM 学生 
                WHERE 班级 in (SELECT 班号 FROM 班级 WHERE 班名 = %s);
            '''
            cursor.execute(select_students_sql, '腾渊班')  # 查询腾渊班的学生
            students = cursor.fetchall()
            print('腾渊班的学生有:')
            for student_info in students:
                print(student_info)
            # 跨表方式2
            select_students_sql = '''
                SELECT 学生.*
                FROM 学生 JOIN 班级 ON 学生.班级 = 班级.班号
                WHERE 班级.班名 = %s;
            '''
            cursor.execute(select_students_sql, '伏流班')  # 查询伏流班的学生
            students = cursor.fetchall()
            print('伏流班的学生有:')
            for student_info in students:
                print(student_info)
            # 查不修改数据,无需提交
            # 删库==================================================================
            if delete_database:
                cursor.execute(delete_database_sql)  # 删库
                cursor.execute(show_sql)  # 查询
                all_database_name = cursor.fetchall()  # 获取查询所有行,返回列表
                if not (database_name,) in all_database_name:
                    print('数据库删除完成')
            else:
                print('未删除数据库')
        else:
            print(f"存在 {database_name} 数据库,为防止删除重要数据数据,已停止执行测试程序")
    # 提交事务
    connection.commit()
except pymysql.MySQLError as e:
    print(f"Error: {e}")
    connection.rollback()  # 回滚
finally:
    # 关闭数据库连接
    connection.close()
    print('链接已关闭')

报错处理

如果报错:

RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods

安装包:cryptography 

        这段代码会创建,修改,然后删除名为testmysql的数据库,如果提示数据库已存在,请更改变量database_name的值,建议打上断点,借助数据库可视化软件观看执行过程。

;