Post

0404MySQL

安装

  • 1.两种方式
    • ①.从mysql下载安装包
    • ②.Homebrew安装:brew install mysql
  • 2.安装PyMySql库:pip3 install pymysql
  • 启动、停止、重启 MySQL 服务的命令:
1
2
3
sudo mysql.server start
sudo mysql.server stop
sudo mysql.server restart

卸载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
rm -rf ~/Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /var/db/receipts/com.mysql.*

检查/usr/local/Cellar目录是否有mysql文件,有的话删除。
检查/usr/local/var 里的mysql文件,有的话删除。
检查/tmp 里的mysql.sock、mysql.sock.lock、 my.cnf文件,有的话删除。
err文件以及pid文件都是在/usr/local/var/mysql中,有的话删除。
brew安装的安装包存储在/usr/local/Library/Cache/Homebrew,有的话删除。

使用

事务及事务的四个属性(ACID)(p40)

1
2
3
4
5
try:
  cursor.execute(sql) #do something
  conn.commit()   #提交事务
except:
  conn.rollback() #回滚事务
属性描述
原子性(atomicity)事务是一个不可分割的工作单位,事务中包括的诸操作要么都做、要么都不做
一致性(consistency)事务必须使数据库从一个一致性状态变到另一个一致一致性状态。一致性与原子性是密切相关的
隔离性(isolation)一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
持久性(durability)持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据做的改变就应该是永久性的。接下来的其他操作或故障不应该对数据有任何影响

①.链接:

1
2
3
4
5
6
7
import pymysql
conn = pymysql.connect(host='localhost', user='root', password=‘’, port=3306)#没链接到特定的数据库(参数db)
#do something
conn.close()

#如果执行 pymysql.connect 报"RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods"错,
#安装cryptography: pip3 install cryptography

②.创建数据库、表(p139)

1
2
3
4
5
6
7
8
#创建库、表还是CRUD都要通过执行语句来执行,执行语句那么得先从Connection对象中到Cursor
cursor = conn.cursor()

#1.创建数据库
cursor.execute('CREATE DATABASE spiders DEFAULT CHARACTER SET utf8mb4')#创建数据库 spiders,并设置默认编码为UTF-8

#2.创建数据表
cursor.execute('CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))')

③.CRUD:

基本的SQL语法和大多的关系型数据库一样(Sql Server、SQLite)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#1.Insert
# A,元组构造各字段值
sql = 'INSERT INTO students(id, name, age) values(%s, %s, %s)'
cursor.execute(sql, ('20120001', 'Bob', 20)) #直接用 三个元素的元组替换vlues里的三个 %sS
# B,字典构造各字段值
data = {'id': '20120001', 'name': 'Bob','age': 21}
table = 'students'
keys = ', '.join(data.keys())           #构造字段
values = ', '.join(['%s'] * len(data))  #构造字段值。这里先是定义一个长度为1的数组[%s],然后用乘法将其扩充为["%s",“%s",“%s'],再调用join 方法就变成了%s, %s, %s
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)

# C,存在则更新: ON DUPLICATE KEY UPDATE
data = {'id': '20120001', 'name': 'Bob','age': 21}
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE '.format(table=table, keys=keys, values=values)
update = ','.join(["{key} = %s".format(key=k) for k in data]) #实质类似[key for key in data ]构造一个数组,在用分隔符将数组里的元素拼接起来
sql += update #INSERT INTO students(id, name, age) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE id = %s,name = %s,age = %s
cursor.execute(sql, tuple(data.values())*2) #由于 VALUES和UPDATE各个字段都用到了值所以*2
  
#2.Update
sql='UPDATE students SET age= %s WHERE name = %s'

#3.Delete
sql = 'DELETE FROM  {table} WHERE {condition}'.format(table='students', condition='age > 20')

#4.Select
sql = 'SELECT * FROM students WHERE age >= 20'

cursor.fetchone()#返回一行数据(跟sqlite3库操作一致)
cursor.fetchall()#返回所有数据
cursor.rowcount #获取查询结果条数
This post is licensed under CC BY 4.0 by the author.