文章目录

  • 一、MySQL在Mac下的安装
  • 二、连接本地数据库,创建新数据库
  • 三、创建表
  • 四、插入数据
  • 五、更新数据
  • 六、删除数据
  • 七、查询数据
  • 八、结束操作



一、MySQL在Mac下的安装

Homebrew 安装:

brew install mysql

启动、停止、重启 MySQL 服务的命令:

sudo mysql.server start
sudo mysql.server stop
sudo mysql.server restart

Mac一般不会作为服务器使用,如果想取消本地 host 绑定,那么需要修改 my.cnf 文件,然后重启服务。

二、连接本地数据库,创建新数据库

通过PyMySQL的connect()方法声明一个MySQL连接对象db。

  • 传入MySQL运行的host (IP)。本地:localhost,远程:公网IP地址
  • port:端口,默认3306

连接成功后,调用cursor()方法获得MySQL的操作游标,利用游标的execute()方法来执行SQL语句。

# 连接本地 MySQL
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306)
cursor = db.cursor()
cursor.execute('SELECT VERSION()')
data = cursor.fetchone()
print('Database version:', data)
# 创建数据库spiders
cursor.execute('CREATE DATABASE spiders DEFAULT CHARACTER SET utf8')

创建数据库后,在连接时需要额外指定一个参数db。

# 连接 MySQL, 注意选择db,下同
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()

三、创建表

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

四、插入数据

执行db对象的commit()方法才可实现数据插入,是真正将语句提交到数据库执行的方法。对于数据插入、更新、删除操作,都需要调用该方法才能生效。

异常处理:执行失败则调用rollback()执行数据回滚。

事务:确保数据的一致性。事务的四个属性 - ACID特性

  1. 原子性 (atomicity) :事务中包含的操作要么都做,要么都不做
  2. 一致性 (consistency) :事务必须使数据库从一个一致性状态变到另一个一致性状态
  3. 隔离性 (isolation) :一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰
  4. 持久性 (durability) :或永久性 (permanence),一个事务一旦提交,它对数据库中数据的改变应该是永久的,接下来的其他操作或故障不应对其有任何影响
# 插入数据
# 通用插入方法,动态变化字典,支持灵活的字典传值
data = {
    'id': '20120001',
    'name': 'Bob',
    'age': 20
}
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
try:
    if cursor.execute(sql, tuple(data.values())):
        print('Successful')
        db.commit()   # 数据插入,将语句提交到数据库执行
except:
    print('Failed')
    db.rollback()   # 异常处理,执行失败则数据回滚

五、更新数据

插入语句: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=key) for key in data])
sql += update
try:
    if cursor.execute(sql, tuple(data.values()) * 2):
        print('Successful')
        db.commit()
except:
    print('Failed')
    db.rollback()

六、删除数据

# 删除数据
table = 'students'
condition = 'age > 20'
sql = 'DELETE FROM {table} WHERE {condition}'.format(table=table, condition=condition)
try:
    cursor.execute(sql)
    db.commit()
except:
    db.rollback()

七、查询数据

调用cursorrowcount属性获取查询结果的条数。

调用fetchone()方法获取结果的第一条数据,返回结果是元组形式,元组的元素顺序跟字段一一对应。

fetchall()方法得到结果的所有数据(二重元祖,每个元素都是一条记录)。注意:此方法返回的是偏移指针指向的数据一致到结束的所有数据

建议用while循环 + fetchone()获取所有数据,每循环一次,指针偏移一条数据,随用随取,简单高效。

而不用fetchall()全部一起获取出来,fetchall()会将结果以元组形式全部返回,如果数据量很大,那么占用的开销会非常高。

# 查询数据
sql = 'SELECT * FROM students WHERE age >= 20'
try:
    cursor.execute(sql)
    print('Count:', cursor.rowcount)
    row = cursor.fetchone()
    while row:	# 逐条获取数据
        print('Row:', row)
        row = cursor.fetchone()
except:
    print('Error')

八、结束操作

# 关闭数据库
db.close()

以上为学习笔记,整理自《Python3 网络爬虫开发实战》