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的值,建议打上断点,借助数据库可视化软件观看执行过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920829.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot基于微信小程序的停车场管理系统

摘 要 停车场管理系统是一种基于移动端的应用程序,旨在方便车主停车的事务办理。该小程序提供了便捷的停车和功能,使车主能够快速完成各项必要的手续和信息填写。旨在提供一种便捷、高效的预约停车方式,减少停车手续的时间和精力成本。通过该…

js:数组转换为字符串

1、使用join 通过join,将数组拼接,使用,进行分割 let array [a, b, c] let str array.join(,); console.log(str) 2、使用toString() const array [a, b, c] const string array.toString() console.log(string) 3、使用扩展运算符和…

npm上传自己封装的插件(vue+vite)

一、npm账号及发包删包等命令 若没有账号,可在npm官网:https://www.npmjs.com/login 进行注册。 在当前项目根目录下打开终端命令窗口,常见命令如下: 1、登录命令:npm login(不用每次都重新登录&#xff0…

路由缓存后跳转到新路由时,上一路由中的tip信息框不销毁问题解决

上一路由tip信息框不销毁问题解决 路由缓存篇问题描述及截图解决思路关键代码 路由缓存篇 传送门 问题描述及截图 路由缓存后跳转新路由时,上一个路由的tip信息框没销毁。 解决思路 在全局路由守卫中获取DOM元素,通过css去控制 关键代码 修改文…

uni-app 界面TabBar中间大图标设置的两种方法

一、前言 最近写基于uni-app 写app项目的时候,底部导航栏 中间有一个固定的大图标,并且没有激活状态。这里记录下实现方案。效果如下(党组织这个图标): 方法一:midButton的使用 官方文档:ta…

Apple Vision Pro开发003-PolySpatial2.0新建项目

unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial(单独导入),或者直接安装 三、对应设置 其他的操作与之前的版本相同…

xiaolin coding 图解网络笔记——基础篇

基础篇 Linux 系统是如何收发网络包的? 网络模型 为了使多种设备能通过网络相互通信,和为了解决不同设备在网络互连中的兼容性问题,国际标准化组织制定了开放式系统互连通信参考模型(Open System Interconnection Reference Mo…

【vba源码】导入excel批注信息

Hi,大家好呀! 又到了一周一分享的时间,上周繁忙的我都没有给大家直播,视频也没更新,那这周大家放心,都会给大家更新,今天我们来讲点啥呢?每周找优质的内容给大家更新是我最最痛苦的…

跨平台WPF框架Avalonia教程 十三

AutoCompleteBox 自动补全输入框 自动补全输入框提供了一个供用户输入的文本框和一个包含可能匹配项的下拉列表。下拉列表会在用户开始输入时显示,并且每输入一个字符,匹配项都会更新。用户可以从下拉列表中选择匹配项。 文本与可能项匹配的方式是可配…

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH(广义自回归条件异方差)模型计算VaR(风险价值)时,方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…

力扣 LeetCode 513. 找树左下角的值(Day8:二叉树)

解题思路: 方法一:递归法(方法二更好理解,个人更习惯方法二) 前中后序均可,实际上没有中的处理 中左右,左中右,左右中,实际上都是左在前,所以遇到的第一个…

Nuget For Unity插件介绍

NuGet for Unity:提升 Unity 开发效率的利器 NuGet 是 .NET 开发生态中不可或缺的包管理工具,你可以将其理解为Unity的Assets Store或者UPM,里面有很多库可以帮助我们提高开发效率。当你想使用一个库,恰好这个库没什么依赖(比如newtonjson),那么下载包并找到Dll直接…

“乐鑫组件注册表”简介

当启动一个新的开发项目时,开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间,还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念,旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…

药房革新:Spring Boot中药实验管理系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

嵌入式 UI 开发的开源项目推荐

嵌入式开发 UI 难吗?你的痛点我懂!作为嵌入式开发者,你是否也有以下困扰?设备资源太少,功能和美观只能二选一?调试效率低,每次调整都要反复烧录和测试?开发周期太长,让你…

CTF--php伪协议结合Base64绕过

Base64绕过 在ctf中,base64是比较常见的编码方式,在做题的时候发现自己对于base64的编码和解码规则不是很了解,并且恰好碰到了类似的题目,在翻阅了大佬的文章后记录一下,对于base64编码的学习和一个工具 base64编码是…

基于Java Springboot电影播放平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

国标GB28181摄像机接入EasyGBS国标GB28181设备管理软件:GB28181-2022媒体传输协议解析

随着信息技术的飞速发展,视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一转变过程中,国标GB28181设备管理软件EasyGBS成为了这场技术变革的重要一环。 GB28181-2022媒体传输协议 媒体传输命令包括实时视音频点播、历史视音频回放/…

Redis-monitor安装与配置

0、前言 压测环境因为隔离原因没法直接查看redis日志跟性能指数,只能通过监控工具查看,使用开源redis-montor监控查看 开源地址: GitCode - 全球开发者的开源社区,开源代码托管平台 1、python环境准备(python -v有的忽略&#xff…

windows basic语言学习笔记,批处理命令的简单使用

BAT学习笔记 前言 Windows 命令行中对参数的大小写不敏感,因此 /D 和 /d 的效果完全一致。 1. 代码1:创建目录并复制文件 源代码: echo off REM 创建目标目录,如果不存在 if not exist "C:\h2" (mkdir "C:\h2&q…