本文参考:Python3网络爬虫开发实战:5.2-关系型数据库存储 部分。

MySQLdb 不支持 Python 3,所以这里使用的库是 PyMySQL。PyMySQL 不是一个 ORM 框架。

PyMySQL 的操作套路一般是下面这样的

# 连接数据库 db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)   cursor = db.cursor() # 执行某个语句 cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8mb4")   # 关闭连接 db.close()

我们关注的就是中间执行语句部分。

创建数据库

db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)   cursor = db.cursor()   cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8mb4")   db.close()

创建表

# 连接时同时连接数据库 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.close()

插入数据

data = {     'id''20120001',     'name''Bob',     'age'20 } # 构建SQL 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() db.close()

更新数据

sql = 'UPDATE students SET age = % s WHERE name = % s' try:    cursor.execute(sql, (25'Bob'))    db.commit() except:    db.rollback() db.close()

如果主键已经存在,则更新数据;如果主键不存在,则插入数据。

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() db.close()

删除数据

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() db.close()

查询数据

sql = 'SELECT * FROM students WHERE age >= 20' try:     cursor.execute(sql)     print('Count:', cursor.rowcount)     one = cursor.fetchone()     print('One:', one)     results = cursor.fetchall()     print('Results:', results)     print('Results Type:', type(results))     for row in results:         print(row) except:     print('Error')

fetchone() 遍历:

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')