21 天 Python 计划:MySQL 数据库初识

前言

Python是一种强大且易于学习的编程语言。通过这个21天的计划,我们将逐步深入MySQL数据库初识。无论你是初学者还是有一定基础的开发者,这个计划都将帮助你巩固和扩展你的Python知识。

在学习本篇之前,我们先复习一下前面的内容:
day1:Python下载和开发工具介绍
day2:数据类型、字符编码、文件处理
day3:基础语法与课外练习
day4:函数简单介绍
day5:模块与包
day6:常用模块介绍
day7:面向对象
day8:面向对象高级
day9:异常处理
day10:网络编程
day10:并发编程

一、数据库管理软件的由来

在早期,数据永久保存通常依赖于文件。然而,这种方式存在诸多局限性。

问题分析

  1. 程序组件分布问题:程序所有组件运行在一台机器上是不现实的。因为这台机器一旦挂掉,整个软件就会崩溃,而且一台机器的性能受硬件限制,垂直扩展有极限。所以,需要将程序组件分布到多台机器上进行水平扩展。
  2. 数据安全问题:将程序组件分布到多台机器后,各组件的数据需要共享,但每台机器只能操作本机文件,导致数据不一致。为解决这个问题,我们将数据与应用程序分离,让多台机器通过网络访问一台机器上的文件,但这会引发数据竞争,需要加锁处理。
  3. 并发问题:为了管理数据库服务器上的文件,需要编写一个 socket 服务端和客户端程序,实现远程连接(支持并发)、打开文件、读写(加锁)和关闭文件等功能。

代码示例(简单的 socket 服务端和客户端示例)

# 服务端代码
import socket
import threading

# 定义锁
lock = threading.Lock()

def handle_client(client_socket):
    while True:
        try:
            # 接收客户端消息
            data = client_socket.recv(1024).decode('utf-8')
            if not data:
                break
            # 模拟文件操作,加锁
            with lock:
                print(f"Received: {data}")
                response = f"Server received: {data}"
                client_socket.send(response.encode('utf-8'))
        except Exception as e:
            print(f"Error: {e}")
            break
    client_socket.close()

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('127.0.0.1', 8888))
    server_socket.listen(5)
    print("Server is listening on port 8888...")

    while True:
        client_socket, addr = server_socket.accept()
        print(f"Accepted connection from {addr}")
        # 为每个客户端创建一个线程
        client_thread = threading.Thread(target=handle_client, args=(client_socket,))
        client_thread.start()

if __name__ == "__main__":
    main()

# 客户端代码
import socket

def main():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('127.0.0.1', 8888))

    while True:
        message = input("Enter a message (or 'q' to quit): ")
        if message.lower() == 'q':
            break
        client_socket.send(message.encode('utf-8'))
        response = client_socket.recv(1024).decode('utf-8')
        print(f"Server response: {response}")

    client_socket.close()

if __name__ == "__main__":
    main()

总结

由于每次编写程序都需要事先写好基于网络操作一台主机上文件的程序,于是有人将此类程序写成专门的处理软件,如 MySQL 等数据库管理软件。MySQL 不仅解决了数据共享问题,还提高了查询效率和安全性,让程序员专注于程序逻辑编写。

二、数据库概述

1. 什么是数据(Data)

描述事物的符号记录称为数据,符号可以是数字、文字、图片、图像、声音、语言等。在计算机中,抽取事物的典型特征组成一条记录,就像文件里的一行内容。例如:

xiao,male,18,1999,广东,计算机系,2017

通过定义字段的意思,我们可以了解记录的具体信息。

2. 什么是数据库(DataBase,简称 DB)

数据库是存放数据的仓库,存放在计算机存储设备上,数据按一定格式存放。它是长期存放在计算机内、有组织、可共享的数据集合,数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性。

3. 什么是数据库管理系统(DataBase Management System 简称 DBMS)

为了科学地组织和存储数据,高效获取和维护数据,需要使用数据库管理系统。常见的数据库管理系统有 MySQL、Oracle、SQLite、Access、MS SQL Server 等。不同的数据库管理系统适用于不同的场景,例如 MySQL 主要用于大型门户,Oracle 用于银行、铁路等,SQL Server 用于大中型企业。

4. 数据库服务器、数据管理系统、数据库、表与记录的关系

  • 记录:由多个字段的信息组成,相当于文件中的一行内容。
  • 表:类似于文件,用于存放多行内容/多条记录。
  • 数据库:类似于文件夹,用于组织文件/表。
  • 数据库管理系统:如 MySQL,是一个软件,用于管理数据库。
  • 数据库服务器:一台计算机,对内存要求较高,运行数据库管理软件。

5. 数据库管理技术的发展历程

  • 人工管理阶段:20 世纪 50 年代中期以前,计算机主要用于科学计算,数据不保存,由应用程序管理,不共享且不具有独立性。
  • 文件系统阶段:20 世纪 50 年代后期到 60 年代中期,有了磁盘等存储设备和操作系统,数据可以长期保存,但共享性差,独立性低。
  • 数据系统阶段:20 世纪 60 年代后期以来,计算机用于管理的规模增大,数据量急剧增长,数据库系统具有数据结构化、共享性高、独立性高、由 DBMS 统一管理和控制等特点。

三、MySQL 介绍

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。它是最流行的关系型数据库管理系统之一,在 WEB 应用方面表现出色。

MySQL 的特点

  • 基于 socket 编写的 C/S 架构软件。
  • 客户端软件包括 MySQL 自带的命令(如 mysql 命令、mysqldump 命令等)和 Python 模块(如 pymysql)。

数据库管理软件分类

  • 关系型:如 SQLite、DB2、Oracle、Access、SQL Server、MySQL 等,SQL 语句通用,需要有表结构。
  • 非关系型:如 MongoDB、Redis、Memcache 等,采用 key - value 存储,没有表结构。

四、下载安装

Linux 版本

二进制 rpm 包安装
yum -y install mysql-server mysql
手动安装步骤
# 1. 解压 tar 包
cd /software
tar -xzvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21

# 2. 添加用户与组
groupadd mysql
useradd -r -g mysql mysql
chown -R mysql:mysql mysql-5.6.21

# 3. 安装数据库
su mysql
cd mysql-5.6.21/scripts
./mysql_install_db --user=mysql --basedir=/software/mysql-5.6.21 --datadir=/software/mysql-5.6.21/data

# 4. 配置文件
cd /software/mysql-5.6.21/support-files
cp my-default.cnf /etc/my.cnf
cp mysql.server /etc/init.d/mysql
vim /etc/init.d/mysql   # 若 mysql 的安装目录是 /usr/local/mysql,则可省略此步
# 修改文件中的两个变更值
# basedir=/software/mysql-5.6.21
# datadir=/software/mysql-5.6.21/data

# 5. 配置环境变量
vim /etc/profile
export MYSQL_HOME="/software/mysql-5.6.21"
export PATH="$PATH:$MYSQL_HOME/bin"
source /etc/profile

# 6. 添加自启动服务
chkconfig --add mysql
chkconfig mysql on

# 7. 启动 mysql
service mysql start

# 8. 登录 mysql 及改密码与配置远程访问
mysqladmin -u root password 'your_password'     # 修改 root 用户密码
mysql -u root -p     # 登录 mysql,需要输入密码
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;     # 允许 root 用户远程访问
mysql>FLUSH PRIVILEGES;     # 刷新权限

Windows 版本

# 1、下载:MySQL Community Server 5.7.16
# http://dev.mysql.com/downloads/mysql/

# 2、解压
# 如果想要让 MySQL 安装在指定目录,那么就将解压后的文件夹移动到指定目录,如:C:\mysql-5.7.16-winx64

# 3、添加环境变量
# 【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为 Path 的一行,双击】 --> 【将 MySQL 的 bin 目录路径追加到变值值中,用 ; 分割】

# 4、初始化
mysqld --initialize-insecure

# 5、启动 MySQL 服务
mysqld # 启动 MySQL 服务

# 6、启动 MySQL 客户端并连接 MySQL 服务
mysql -u root -p # 连接 MySQL 服务器

# 制作 MySQL 的 Windows 服务,在终端执行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --install

# 移除 MySQL 的 Windows 服务,在终端执行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --remove

# 启动 MySQL 服务
net start mysql

# 关闭 MySQL 服务
net stop mysql

五、MySQL 软件基本管理

1. 启动查看

[root@xiao~]# systemctl start mariadb # 启动
[root@xiao~]# systemctl enable mariadb # 设置开机自启动
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@xiao~]# ps aux |grep mysqld |grep -v grep # 查看进程,mysqld_safe 为启动 mysql 的脚本文件,内部调用 mysqld 命令
mysql     3329  0.0  0.0 113252  1592 ?        Ss   16:19   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql     3488  0.0  2.3 839276 90380 ?        Sl   16:19   0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
[root@xiao~]# netstat -an |grep 3306 # 查看端口
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN  
[root@xiao ~]# ll -d /var/lib/mysql # 权限不对,启动不成功,注意 user 和 group
drwxr-xr-x 5 mysql mysql 4096 Jul 20 16:28 /var/lib/mysql

2. 登录,设置密码

# 设置初始密码 由于原密码为空,因此 -p 可以不用
[root@xiao ~]# mysqladmin -uroot password "123"
# 修改 mysql 密码,因为已经有密码了,所以必须输入原密码才能设置新密码
[root@xiao ~]# mysqladmin -uroot -p"123" password "456"

# 命令格式
[root@xiao~]# mysql -h172.31.0.2 -uroot -p456
[root@xiao~]# mysql -uroot -p
[root@xiao~]# mysql                    # 以 root 用户登录本机,密码为空

3. 忘记密码

Linux 平台
# 方式一:所有授权信息全部丢失!!!
[root@xiao~]# rm -rf /var/lib/mysql/mysql
[root@xiao~]# systemctl restart mariadb
[root@xiao~]# mysql

# 方式二
[root@xiao~]# vim /etc/my.cnf    # mysql 主配置文件
[mysqld]
skip-grant-table
[root@xiao~]# systemctl restart mariadb
[root@xiao~]# mysql
MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> \q
[root@xiao~]# # 打开 /etc/my.cnf 去掉 skip-grant-table,然后重启
[root@xiao~]# systemctl restart mariadb
[root@xiao~]# mysql -u root -p123 # 以新密码登录
Windows 平台
# 方式一
# 1 关闭 mysql
# 2 在 cmd 中执行:mysqld --skip-grant-tables
# 3 在 cmd 中执行:mysql
# 4 执行如下 sql:
update mysql.user set authentication_string=password('') where user = 'root';
flush privileges;

# 5 tskill mysqld # 或 taskkill -f /PID 7832
# 6 重新启动 mysql

# 方式二
# 1. 关闭 mysql,可以用 tskill mysqld 将其杀死
# 2. 在解压目录下,新建 mysql 配置文件 my.ini
# 3. my.ini 内容,指定
[mysqld]
skip-grant-tables

# 4. 启动 mysqld
# 5. 在 cmd 里直接输入 mysql 登录,然后操作
update mysql.user set authentication_string=password('') where user='root and host='localhost';

flush privileges;

# 6. 注释 my.ini 中的 skip-grant-tables,然后启动 myqsld,然后就可以以新密码登录了

4. 在 Windows 下,为 MySQL 服务指定配置文件

# 在 mysql 的解压目录下,新建 my.ini,然后配置
# 1. 在执行 mysqld 命令时,下列配置会生效,即 mysql 服务启动时生效
[mysqld]
;skip-grant-tables
port=3306
character_set_server=utf8
default-storage-engine=innodb
innodb_file_per_table=1

# 解压的目录
basedir=E:\mysql-5.7.19-winx64
# data 目录
datadir=E:\my_data # 在 mysqld --initialize 时,就会将初始数据存入此处指定的目录,在初始化之后,启动 mysql 时,就会去这个目录里找数据

# 2. 针对客户端命令的全局配置,当 mysql 客户端命令执行时,下列配置生效
[client]
port=3306
default-character-set=utf8
user=root
password=123

# 3. 只针对 mysql 这个客户端的配置,2 中的是全局配置,而此处的则是只针对 mysql 这个命令的局部配置
[mysql]
;port=3306
;default-character-set=utf8
user=xiao
password=4573

#!!!如果没有 [mysql],则用户在执行 mysql 命令时的配置以 [client] 为准

5. 统一字符编码

# 1. 修改配置文件
[mysqld]
default-character-set=utf8 
[client]
default-character-set=utf8 
[mysql]
default-character-set=utf8

# mysql5.5 以上:修改方式有所改动
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

# 2. 重启服务
# 3. 查看修改结果:
\s
show variables like '%char%'

# 第一步:设置数据库字符编码为 utf8mb4_general_ci  设置相应表字段字符编码为 utf8mb4_general_ci

# 第二步:设置 my.cnf 增加以下配置信息
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

# 第三步:重启 MySQL 保存表情数据查看数据库就可以看到数据库中有表情字符的存在。

六、初识 SQL 语句

有了 MySQL 数据库软件,有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱出来,专注于对程序逻辑的编写mysql服务端软件即mysqld帮我们管理好文件夹以及文件,前提是作为使用者的我们,需要下载mysql的客户端,或者其他模块来连接到mysqld,然后使用mysql软件规定的语法格式去提交自己命令,实现对文件夹或文件的管理。该语法即sql(Structured Query Language 即结构化查询语言)

# 1. 操作文件夹
增:create
database
db1
charset
utf8;
查:show
databases;
改:alter
database
db1
charset
latin1;
删除: drop
database
db1;

# 2. 操作文件
先切换到文件夹下:use
db1
增:create
table
t1(id
int, name
char);
查:show
tables
改:alter
table
t1
modify
name
char(3);
alter
table
t1
change
name
name1
char(2);
删:drop
table
t1;

# 3. 操作文件中的内容/记录
增:insert
into
t1
values(1, 'xiao1'), (2, 'xiao2'), (3, 'xiao3');
查:select *
from t1;

改:update
t1
set
name = 'sb'
where
id = 2;
删:delete
from t1 where

id = 1;

清空表:
delete
from t1;  # 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。

truncate
table
t1;
数据量大,删除速度比上一条快,且直接从零开始,

auto_increment
表示:自增
primary
key
表示:约束(不能重复且不能为空);加速查找复制代码

SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
#1、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
#2、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
#3、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE

结语

通过这个21天的Python计划,我们涵盖了MySQL数据库初识。希望这些内容能帮助你更好地理解和使用Python。继续学习和实践,你将成为一名优秀的Python开发者!

资料领取

私信老肖领取资料相关。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网搬砖工老肖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值