ToB企服应用市场:ToB评测及商务社交产业平台

标题: day22-MySQL入门 [打印本页]

作者: 风雨同行    时间: 2024-5-18 05:44
标题: day22-MySQL入门
1. 安装 & 配置 & 启动

MySQL现在的版本重要分为:
以是,我们课程会以常用大版本中最新的版本为例来讲解,即:5.7.31 (依然有许多企业在用5.6.x,但新项目根本上都是5.7.x了)。
1.1 win系统

第1步:下载安装

https://downloads.mysql.com/archives/community/

第2步:解压至任意文件夹

建议解压至软件安装目次,例如:

第3步:创建配置文件

在MySQL的安装目次下创建 my.ini 的文件,作为MySQL的配置文件。

其实,MySQL的配置文件可以放在许多的目次,下图是配置文件的优先级:

强烈,建议大家照旧把配置文件放在MySQL安装目次下,这样以后电脑上想要安装多个版本的MySQL时,配置文件可以相互独立不影响。
留意:如果你电脑的上述其他目次存在MySQL配置文件,建议删除,否则可能会影响MySQL的启动。
第4步:初始化
  1. >>> "C:\Program Files\mysql-5.7.31-winx64\bin\mysqld.exe"  --initialize-insecure
复制代码
初始化下令在执行时,会自动读取配置文件并执行初始化,此过程重要会做两件事:

在windowns安装过程中如果有报错 ( msvcr120.dll不存在 ),请下载并安装下面的两个补丁:
第5步:启动

启动MySQL常见的有两种方式:
第6步:测试连接MySQL

安装并启动MySQL之后,就可以连接MySQL来测试是否已正确安装并启动乐成。

以后在开发时,肯定是要用Python代码来连接MySQL而且进行数据操作(后面讲)。
在安装MySQL时,其实也自动安装了一个工具(客户端),让我们快速实现连接MySQL并发送指令。

留意:如果把bin目次参加情况变量,每次在运行下令时,就不消再重新输入绝对路径了。

上述过程如果操作完成之后,证明你的安装和启动过程就搞定了。
1.2 mac系统

mac系统和win不同,MySQL为他提供了非常方便的一站式安装步伐,只要点击、next就可以安装、初始化完成。
第1步:安装和初始化

https://downloads.mysql.com/archives/community/



这个基于dmg文件的安装过程,其实包含了:
第2步:创建配置文件

建议在MySQL安装目次下创建 etc/my.cnf 作为MySQL的配置文件。

MySQL的配置文件按照优先级,会在以下目次中寻找:

为了制止多个版本共存时,配置文件杂乱的问题,建议大家照旧把配置文件放在当前MySQL的安装目次下。
第3步:启动

在Mac系统中启动MySQL常见的有2种方式:
第一种mysql.server脚本的情势,内部是利用 mysqld_safe运行,可以守护我们的MySQL进程,如不测挂掉可自动重启。
第4步:测试连接MySQL

安装并启动MySQL之后,就可以连接MySQL来测试是否已正确安装并启动乐成。

以后在开发时,肯定是要用Python代码来连接MySQL而且进行数据操作(后面讲)。
在安装MySQL时,其实也自动安装了一个工具(客户端),让我们快速实现连接MySQL并发送指令。


留意:/usr/local/mysql/bin也可以参加到情况变量。
至此,在Mac系统中关于MySQL的安装和配置就完成了。
1.3 关于配置文件

上述的过程中,我们在配置文件中只添加了很少的配置。
其实,配置项有许多,而哪些配置项都有默认值,如果我们不配置,MySQL则自动利用默认值。
1.4 关于暗码

1. 设置和修改root暗码

在windows系统中模块默认 root 账户是没有暗码的,如果想要为账户设定暗码,可以在利用root账户登录乐成之后,执行:

2. 忘记root暗码

如果你忘记了MySQL账户的暗码。
2. 数据库 管理

安装上数据库之后,就需要开始学习指令了,通过指令让MySQL去做出一些文件操作。

如果将数据库管理系统与之前的文件管理做类比的话:
数据库管理系统文件管理数据库文件夹数据表文件夹下的excel文件接下来,我们先学习 数据库(文件夹)相干操作的指令。

2.1 内置客户端操作

当连接上MySQL之后,执行如下指令(一般称为SQL语句),就可以对MySQL的数据进行操作。
示例:
  1. # 1.登录MySQL
  2. wupeiqi@wupeiqideMBP ~ % /usr/local/mysql/bin/mysql -u root -p
  3. Enter password:
  4. Welcome to the MySQL monitor.  Commands end with ; or \g.
  5. Your MySQL connection id is 5
  6. Server version: 5.7.31 MySQL Community Server (GPL)
  7. Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
  8. Oracle is a registered trademark of Oracle Corporation and/or its
  9. affiliates. Other names may be trademarks of their respective
  10. owners.
  11. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  12. # 2.查看当前数据库
  13. mysql> show databases;
  14. +--------------------+
  15. | Database           |
  16. +--------------------+
  17. | information_schema |
  18. | mysql              |
  19. | performance_schema |
  20. | sys                |
  21. +--------------------+
  22. 4 rows in set (0.00 sec)
  23. # 3. 创建数据库:  create database 数据库名 default charset 编码 collate 排序规则;
  24. mysql> create database db1 default charset utf8 collate utf8_general_ci;
  25. Query OK, 1 row affected (0.00 sec)
  26. mysql> show databases;
  27. +--------------------+
  28. | Database           |
  29. +--------------------+
  30. | information_schema |
  31. | db1                |
  32. | mysql              |
  33. | performance_schema |
  34. | sys                |
  35. +--------------------+
  36. 5 rows in set (0.01 sec)
  37. # 4. 删除数据库
  38. mysql> drop database db1;
  39. Query OK, 0 rows affected (0.00 sec)
  40. # 5. 查看当前数据库
  41. mysql> show databases;
  42. +--------------------+
  43. | Database           |
  44. +--------------------+
  45. | information_schema |
  46. | mysql              |
  47. | performance_schema |
  48. | sys                |
  49. +--------------------+
  50. 4 rows in set (0.00 sec)
  51. # 6. 进入数据库
  52. mysql> use mysql;
  53. Reading table information for completion of table and column names
  54. You can turn off this feature to get a quicker startup with -A
  55. Database changed
  56. # 7. 进入mysql数据库(文件夹),查看此数据库下的所有表。
  57. mysql> show tables;
  58. +---------------------------+
  59. | Tables_in_mysql           |
  60. +---------------------------+
  61. | columns_priv              |
  62. | db                        |
  63. | engine_cost               |
  64. | event                     |
  65. | func                      |
  66. | general_log               |
  67. | gtid_executed             |
  68. | help_category             |
  69. | help_keyword              |
  70. | help_relation             |
  71. | help_topic                |
  72. | innodb_index_stats        |
  73. | innodb_table_stats        |
  74. | ndb_binlog_index          |
  75. | plugin                    |
  76. | proc                      |
  77. | procs_priv                |
  78. | proxies_priv              |
  79. | server_cost               |
  80. | servers                   |
  81. | slave_master_info         |
  82. | slave_relay_log_info      |
  83. | slave_worker_info         |
  84. | slow_log                  |
  85. | tables_priv               |
  86. | time_zone                 |
  87. | time_zone_leap_second     |
  88. | time_zone_name            |
  89. | time_zone_transition      |
  90. | time_zone_transition_type |
  91. | user                      |
  92. +---------------------------+
  93. 31 rows in set (0.00 sec)
  94. # 8. 退出
  95. mysql>exit;
复制代码
2.2 Python代码操作

无论通过何种方式去连接MySQL,本质上发送的 指令 都是相同的,只是连接的方式和操作情势不同而已。
当连接上MySQL之后,执行如下指令,就可以对MySQL的数据进行操作。(同上述过程)
想要利用Python操作MySQL需要安装第三方模块:
  1. pip3 install pymysql
复制代码

安装完成后,就可以编写代码:
  1. import pymysql
  2. # 连接MySQL(socket)
  3. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8")
  4. cursor = conn.cursor()
  5. # 1. 查看数据库
  6. # 发送指令
  7. cursor.execute("show databases")
  8. # 获取指令的结果
  9. result = cursor.fetchall()
  10. print(result) # (('information_schema',), ('mysql',), ('performance_schema',), ('sys',))
  11. # 2. 创建数据库(新增、删除、修改)
  12. # 发送指令
  13. cursor.execute("create database db3 default charset utf8 collate utf8_general_ci")
  14. conn.commit()
  15. # 3. 查看数据库
  16. # 发送指令
  17. cursor.execute("show databases")
  18. # 获取指令的结果
  19. result = cursor.fetchall()
  20. print(result) # (('information_schema',), ('db3',), ('mysql',), ('performance_schema',), ('sys',))
  21. # 4. 删除数据库
  22. # 发送指令
  23. cursor.execute("drop database db3")
  24. conn.commit()
  25. # 3. 查看数据库
  26. # 发送指令
  27. cursor.execute("show databases")
  28. # 获取指令的结果
  29. result = cursor.fetchall()
  30. print(result) # (('information_schema',), ('mysql',), ('performance_schema',), ('sys',))
  31. # 5. 进入数据库,查看表
  32. # 发送指令
  33. cursor.execute("use mysql")
  34. cursor.execute("show tables")
  35. result = cursor.fetchall()
  36. print(result) # (('columns_priv',), ('db',), ('engine_cost',), ('event',), ('func',), ('general_log',),....
  37. # 关闭连接
  38. cursor.close()
  39. conn.close()
复制代码
3. 数据表 管理


如果将数据库管理系统与之前的文件管理做类比的话:
数据库管理系统文件管理数据库文件夹数据表文件夹下的文件接下来,我们先学习 数据表(文件夹中的文件)相干操作的指令。

其实在数据库中创建数据库 和 创建Excel非常类似,需要指定: 表名、列名称、类类型(整型、字符串或其他)。
3.1 内置客户端操作

数据表常见操作的指令:
上述就是关于数据表的一些根本操作。
3.2 MySQL代码操作

基于Python去连接MySQL之后,想要进行数据表的管理的话,发送的指令其实都是相同的,例如:
  1. import pymysql
  2. # 连接MySQL
  3. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8")
  4. cursor = conn.cursor()
  5. # 1. 创建数据库
  6. """
  7. cursor.execute("create database db4 default charset utf8 collate utf8_general_ci")
  8. conn.commit()
  9. """
  10. # 2. 进入数据库、查看数据表
  11. """
  12. cursor.execute("use db4")
  13. cursor.execute("show tables")
  14. result = cursor.fetchall()
  15. print(result)
  16. """
  17. # 3. 进入数据库创建表
  18. cursor.execute("use db4")
  19. sql = """
  20. create table L4(
  21.     id int not null primary key auto_increment,
  22.     title varchar(128),
  23.     content text,
  24.     ctime datetime
  25. )default charset=utf8;
  26. """
  27. cursor.execute(sql)
  28. conn.commit()
  29. # 4. 查看数据库中的表
  30. """
  31. cursor.execute("show tables")
  32. result = cursor.fetchall()
  33. print(result)
  34. """
  35. # 5. 其他 drop table... 略过
  36. # 关闭连接
  37. cursor.close()
  38. conn.close()
复制代码
4.数据行

当数据库和数据表创建完成之后,就需要对数据表中的内容进行:增、删、改、查了。

4.1 内置客户端操作

数据行操作的相干SQL语句(指令)如下:
4.2 Python代码操作

  1. import pymysql
  2. # 连接MySQL,自动执行 use userdb; -- 进入数据库
  3. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db='userdb')
  4. cursor = conn.cursor()
  5. # 1.新增(需commit)
  6. """
  7. cursor.execute("insert into tb1(name,password) values('武沛齐','123123')")
  8. conn.commit()
  9. """
  10. # 2.删除(需commit)
  11. """
  12. cursor.execute("delete from tb1 where id=1")
  13. conn.commit()
  14. """
  15. # 3.修改(需commit)
  16. """
  17. cursor.execute("update tb1 set name='xx' where id=1")
  18. conn.commit()
  19. """
  20. # 4.查询
  21. """
  22. cursor.execute("select * from tb where id>10")
  23. data = cursor.fetchone() # cursor.fetchall()
  24. print(data)
  25. """
  26. # 关闭连接
  27. cursor.close()
  28. conn.close()
复制代码
其实在真正做项目开发时,流程如下:
例如:实现一个 用户管理系统。
先利用MySQL自带的客户端创建相干 数据库和表结构(相称于先创建好Excel结构)。
  1. create database usersdb default charset utf8 collate utf8_general_ci;
复制代码
  1. create table users(
  2.     id int not null primary key auto_increment,
  3.     name varchar(32),
  4.     password varchar(64)
  5. )default charset=utf8;
复制代码
再在步伐中执行编写相应的功能实现 注册、登录 等功能。
  1. import pymysql
  2. def register():
  3.     print("用户注册")
  4.     user = input("请输入用户名:") # alex
  5.     password = input("请输入密码:") # sb
  6.     # 连接指定数据
  7.     conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db="usersdb")
  8.     cursor = conn.cursor()
  9.     # 执行SQL语句(有SQL注入风险,稍后讲解)
  10.     # sql = 'insert into users(name,password)values("alex","sb")'
  11.     sql = 'insert into users(name,password) values("{}","{}")'.format(user, password)
  12.    
  13.     cursor.execute(sql)
  14.     conn.commit()
  15.     # 关闭数据库连接
  16.     cursor.close()
  17.     conn.close()
  18.     print("注册成功,用户名:{},密码:{}".format(user, password))
  19. def login():
  20.     print("用户登录")
  21.     user = input("请输入用户名:")
  22.     password = input("请输入密码:")
  23.     # 连接指定数据
  24.     conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db="usersdb")
  25.     cursor = conn.cursor()
  26.     # 执行SQL语句(有SQL注入风险,稍后讲解)
  27.     # sql = select * from users where name='wupeiqi' and password='123'
  28.     sql = "select * from users where name='{}' and password='{}'".format(user, password)
  29.     cursor.execute(sql)
  30.    
  31.     result = cursor.fetchone() # 去向mysql获取结果
  32.     # None
  33.     # (1,wupeiqi,123)
  34.    
  35.    
  36.     # 关闭数据库连接
  37.     cursor.close()
  38.     conn.close()
  39.     if result:
  40.         print("登录成功", result)
  41.     else:
  42.         print("登录失败")
  43. def run():
  44.     choice = input("1.注册;2.登录")
  45.     if choice == '1':
  46.         register()
  47.     elif choice == '2':
  48.         login()
  49.     else:
  50.         print("输入错误")
  51. if __name__ == '__main__':
  52.     run()
复制代码
So,你会发现, 在项目开发时,数据库 & 数据表 的操作其实就做那么一次,最最常写的照旧 对数据行 的操作。
5.关于SQL注入

假如,你开发了一个用户认证的系统,应该用户登录乐成后才能正确的返回相应的用户结果。
  1. import pymysql
  2. # 输入用户名和密码
  3. user = input("请输入用户名:") # ' or 1=1 --
  4. pwd = input("请输入密码:") # 123
  5. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8",db='usersdb')
  6. cursor = conn.cursor()
  7. # 基于字符串格式化来 拼接SQL语句
  8. # sql = "select * from users where name='alex' and password='123'"
  9. # sql = "select * from users where name='' or 1=1 -- ' and password='123'"
  10. sql = "select * from users where name='{}' and password='{}'".format(user, pwd)
  11. cursor.execute(sql)
  12. result = cursor.fetchone()
  13. print(result) # None,不是None
  14. cursor.close()
  15. conn.close()
复制代码
如果用户在输入user时,输入了:   ' or 1=1 --      ,这样纵然用户输入的暗码不存在,也会可以通过验证。
为什么呢?
由于在SQL拼接时,拼接后的结果是:
  1. select * from users where name='' or 1=1 -- ' and password='123'
复制代码
留意:在MySQL中 -- 表示注释。
那么,在Python开发中 怎样来制止SQL注入呢?
切记,SQL语句不要在利用python的字符串格式化,而是利用pymysql的execute方法。
  1. import pymysql
  2. # 输入用户名和密码
  3. user = input("请输入用户名:")
  4. pwd = input("请输入密码:")
  5. conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root123', charset="utf8", db='userdb')
  6. cursor = conn.cursor()
  7. cursor.execute("select * from users where name=%s and password=%s", [user, pwd])
  8. # 或
  9. # cursor.execute("select * from users where name=%(n1)s and password=%(n2)s", {"n1": user, 'n2': pwd})
  10. result = cursor.fetchone()
  11. print(result)
  12. cursor.close()
  13. conn.close()
复制代码
总结


除了 【第5步 用户授权】以外,现在利用的是默认root账户(拥有最大权限),上述全部的过程已讲解完毕。
本节内容大家需要掌握:
作业

  1. create table admin(
  2.   id int not null auto_increment primary key,        -- 不允许为空 & 主键 & 自增
  3.   name varchar(32) not null,
  4.   password varchar(64) not null,
  5.   gender char(1) not null,
  6.   email varchar(64) null,
  7.   amount decimal(10,2) not null default 0,
  8.   ctime datetime
  9. )default charset=utf8;
复制代码
  1. insert into admin(name,password,gender,email,amount,ctime) values("武沛齐","123123","男","xxx@live.com",19991.12,NOW());
  2. insert into admin(name,password,gender,email,amount,ctime) values("alex","sb","男","alex@live.com",991.12,NOW());
  3. insert into admin(name,password,gender,email,amount,ctime) values("eric","8888","女","eric@live.com",991.12,NOW());
  4. insert into admin(name,password,gender,email,amount,ctime) values("tony","123123123","女","xxxxxxxx@live.com",200.12,NOW()), ("kelly","8888","女","kelly@live.com",991.12,NOW());
复制代码
  1. update admin set gender="男" where id>3;
复制代码
  1. select * from admin where amount>1000;
复制代码
  1. update admin set amount=amount+1000;
复制代码
  1. delete from admin where gender="男";
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4