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