安装 MySql

由于 colab 没有 yum 也没有 rpm,也没有 systemctl,然后好不容易搜索到一份用 apt-get 安装的代码,试了试能跑,然后运行的时候找不到服务 mysql。折腾两天,没搞定,然后换了个安装教程成功了。哇,真神奇,原来是通过这样的方式解决的

直接运行下面命令安装 mysql

1
2
!sudo apt update
!sudo apt install mysql-server

然后

1
!sudo service mysql start

启动 mysql 数据库的服务。

然后用

1
!sudo mysql -u root -p

进入大概是 mysql 的命令行的地方。密码直接输入回车就可以了。

MySql 命令

数据库

1
2
3
4
5
6
7
8
# 创建一个名为 RUNOOB 的数据库
create DATABASE RUNOOB;
# 删除一个名为 RUNOOB 的数据库
drop database RUNOOB;
# 选择一个名为 RUNOOB 的数据库
use RUNOOB;
# 查看已有的数据库
show databases;

数据类型

数据类型可以分为数值、日期和字符串三类,具体还是见菜鸟教程主要是懒得搬运了

数据表

通过下面命令可以创建一个数据表

1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

其中 runoob_tbl 是数据表的名称,后面的括号中每一项先是一列的名称,接着是它的数据类型或者相关的一些属性。

  • 其中 AUTO_INCREMENT 是指自增的属性,类似于 id,每插入一条增加 1。
  • NOT NULL 用于设置该列不允许有缺失,当插入一条该列为缺失字段的记录时会报错。
  • PRIMARY KEY 关键字用于定义列为主键。如果定义多列为主键,列之间用逗号分隔。
  • VARCHAR 是指可变长的字符串,其中括号中的数字指的是最大长度。
  • ENGINE 设置存储引擎,CHARSET 设置编码。

关于数据表本身还有一些其他的命令:

  • show tables; :显示当前数据库中的数据表
  • desc runoob_tbl;:描述指定的数据表
  • drop table runoob_tbl;:删除指定的数据表

插入和查询数据

MySql 中插入语句的语法如下:

1
2
3
INSERT INTO table_name ( field1, field2,..., fieldN )
VALUES
( value1, value2,..., valueN );

例如我们可以用下面的语句来插入一条数据:

1
2
INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date)
VALUES ("学习 PHP", "菜鸟教程", NOW());

在 MySql 中一般可以用 select 语句来进行查询:

1
SELECT column_name FROM table_name [WHERE Clause] [LIMIT N] [OFFSET M]
  • 可以同时在多个数据表中查询数据,用逗号分隔这些数据表名称即可。
  • 也可以同时查询多个列,也是用逗号分隔。
  • 可以用 * 作为列的名称,这样会查询所有列的数据。
  • WHERE 用于限定条件,接下来会介绍。
  • LIMIT 限制返回的记录数的上限。
  • OFFSET 表示查询的偏移量,默认为 0。

WHERE 子句

WHERE 用于限定查询的记录需要满足的条件。可以用 OR 以及 AND 连接多个条件。每个条件关于某个属性取值的,例如 Money >= 30,其中 Money 是某一列的名称。

比较运算符除了相等是单个等号,剩下都和通用的编程语言类似。

MySql 比较字符串的时候会忽略大小写,需要在加入 BINARY 关键字来区分大小写。例如

1
SELECT * from runoob_tbl WHERE BINARY runoob_author='runoob.com';

Python 连接 MySql 数据库

通过上面的方法安装,得到的 root 账户授权好像是一些奇怪的方式,直接连接不太好弄。先通过下面命令设置一下密码(这里直接把密码设置为 123456):

1
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '123456';

然后安装模块 pymysql

然后通过

1
db = pymysql.connect(host = 'localhost', user = 'root', passwd = '123456', db = 'RUNOOB', charset="utf8")

来连接数据库。

可以通过下面的代码来执行 mysql 语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 获取操作游标
cursor = db.cursor()
# 要执行的 sql 语句
cmd = """INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date)
VALUES ('a', 'b', NOW())"""

try :
# 执行 sql 语句
cursor.execute(cmd)
# 将修改提交到数据库中,否则数据库的内容不会改变
db.commit()
except :
db.rollback()

查询的话先和上面一样用 cursor.execute 执行 SELECT 的语句,然后用下面三种方法中的任意一个来获得查询的结果:

  • cursor.fetchone() 获取下一个查询的结果,返回一个元组
  • cursor.fetchall() 获取所有的查询结果,会返回一些元组构成的元组
  • cursor.rowcount 返回执行 execute() 后影响的行数

例如运行下面代码

1
2
3
4
5
6
cmd = "SELECT * FROM runoob_tbl"

cursor.execute(cmd)
results = cursor.fetchall()

results, type(results)

然后得到:

1
2
3
(((1, '学习 PHP', '菜鸟教程', datetime.date(2023, 7, 29)),
(2, 'a', 'b', datetime.date(2023, 7, 29))),
tuple)

最后用

1
db.close()

关闭数据库连接。