需要的库:pymysql
请大家下载MySQL后使用可视化工具创建数据库,本文不推荐使用sql语句创建database和表。
创建数据库的命令参考这篇文章:MYSQL创建数据库,表,以及相关查询命令_清酒忄的博客-CSDN博客_mysql创建读者信息表
1,连接数据库在连接数据库之后我们还需要cursor也就是游标来 *** 作数据库里的数据
import pymysql
# 参数分别是ip,用户,密码,端口(默认3306),数据库名字
db = pymysql.connect(host='localhost', user='root', password='12345678', port=3306, db='spiders')
# 得到游标对象
cursor = db.cursor()
# 必须要有close语句!!!
db.close()
2,最基础的pymysql执行的流程
import pymysql
db = pymysql.connect(host='localhost', user='root', password='12345678', port=3306)
cursor = db.cursor()
# 这里来执行创建一个新sql数据库语句,如果执行的是插入数据,还需要db.commit()来提交
cursor.execute(‘CREATE DATABASE spiders’)
# 关闭数据库必须要有,否则数据可能存储失败或损坏
db.close()
3,插入数据
这里直接用格式化sql语句来 *** 作浮动的字典,其中键是title
import pymysql
# 这是一个动态字典
data_dict = {
'id': '20220420',
'name': 'DJY',
'age': 14,
'gender': 'girl'
}
tabel = 'students'
# 创造键
keys = ', '.join(data_dict.keys())
print(keys)
# 创造跟值等数量的占位符
values = ', '.join(['%s'] * len(data_dict.values()))
print(values)
# 参数db是创建后数据库的名字。
db = pymysql.connect(host='localhost', user='root', password='12345678', port=3306, db='spiders')
cursor = db.cursor()
# 下面的sql语句表示往students中插入几个值,%s是占位符,在execute里用元组传过来就好了
# 用这样的方式传入字典,可以有动态的效果
sql = f'INSERT INTO {tabel}({keys}) values({values})'
try:
cursor.execute(sql, tuple(data_dict.values()))
# 在插入或者删除中commit是真正将sql语句上传执行的环节
db.commit()
except Exception as e:
print(e)
# 如果发生了错误,就回溯,就像什么都没有发生过。
db.rollback()
finally:
db.close()
最基础的插入sql语句是这样的
‘INSERT INTO tabel(keys) values(values)’
---------------------------------------------------------------------
在爬虫的过程中,有的时候我们会有重复的数据,在我们的表中是可以设置主键的,而这些主键是不可以重复的,就像id,所以说如果主键已经存在了,那么就应该覆盖原来的数据。这只要加一个update语句即可实现。
import pymysql
# 这是一个动态字典
data_dict = {
'id': '20220420',
'name': 'DJY',
'age': 14,
'gender': 'girl'
}
tabel = 'students'
# 创造键
keys = ', '.join(data_dict.keys())
print(keys)
# 创造跟值等数量的占位符
values = ', '.join(['%s'] * len(data_dict.values()))
print(values)
# 这里来创建一个update的格式
update_list = []
for key in data_dict.keys():
update_list.append(f'{key} = %s')
update = ', '.join(update_list)
print(update)
# 参数db是创建后数据库的名字。
db = pymysql.connect(host='localhost', user='root', password='12345678', port=3306, db='spiders')
cursor = db.cursor()
# 下面的sql语句表示往students中插入几个值,%s是占位符,在execute里用元组传过来就好了
# 用这样的方式传入字典,可以有动态的效果,ON...表示如果主键重复,那么就更新数据
sql = f'INSERT INTO {tabel}({keys}) values({values}) ON DUPLICATE KEY UPDATE '
sql += update
print(sql)
try:
cursor.execute(sql, tuple(data_dict.values())*2) # 因为有六个占位符,所以*2
# 在插入数据中commit才是真正提交 *** 作sql的语句
db.commit()
except Exception as e:
print(e)
# 如果发生了错误,就回溯,就像什么都没有发生过。
db.rollback()
finally:
db.close()
原语句长这样
‘INSERT INTO tabel(keys) values(values) ON DUPLICATE KEY UPDATE keys = ‘values’’
4,删除数据
sql的删除数据需要有一个条件,因为逻辑联接符很多,所以采用字符串拼接的方法
condition = 'gender = "None"' # 表示删除gender为‘None’的数据,其他运算符参考文档
del_sql = f'DELETE FROM {tabel} WHERE {condition}'
try:
cursor.execute(del_sql)
db.commit()
except Exception as e:
print(e)
# 如果发生了错误,就回溯,就像什么都没有发生过。
db.rollback()
finally:
db.close()
原语句长这样
‘DELETE FROM tabel WHERE condition’
5,查询数据
MySQL内部有一个偏移指针,每调用一次fetchone就会把指针向下偏移一个单位,而fetchall就会直接偏移到表的最底部。查询语句同样有条件的选择。
condition2 = 'age <= 15' # 表示查询age小于等于15的数据
find_sql = f'SELECT * FROM {tabel} WHERE {condition2}'
try:
cursor.execute(find_sql)
# fetchone是查询第一条,fetchall是查询所有, 返回是元组,如果没有条目就返回None
# sql内部有一个偏移指针,最开始是指向第一条数据,当我们使用一次fetchone方法,偏移指针就会偏移到下一条数据
first_data = cursor.fetchone()
print(first_data)
total_data = cursor.fetchall() # 调用了一次fetchone指针向后偏移所以现在是第二条到最后一条
print(total_data)
# 在插入数据中commit才是真正提交操作sql的语句
db.commit()
except Exception as e:
print(e)
# 如果发生了错误,就回溯,就像什么都没有发生过。
db.rollback()
finally:
db.close()
不建议使用fetchall来查询,这样的话如果数据量过大会占用太多的内存资源,因为内部指针的特性,我们可以用while语句来一条一条查询,只要fetchone找不到了就会返回None,那么循环也就结束了。
condition2 = 'age <= 15' # 表示查询age小于等于15的数据
find_sql = f'SELECT * FROM {tabel} WHERE {condition2}'
try:
cursor.execute(find_sql)
# fetchone是查询第一条,fetchall是查询所有, 返回是元组,如果没有条目就返回None
# sql内部有一个偏移指针,最开始是指向第一条数据,当我们使用一次fetchone方法,偏移指针就会偏移到下一条数据
data = cursor.fetchone()
# 如果data是有数据的那么一直循环,是None了就结束循环了
while data:
data = cursor.fetchone()
print(data)
except Exception as e:
print(e)
# 如果发生了错误,就回溯,就像什么都没有发生过。
db.rollback()
finally:
db.close()
原来的长这样
‘SELECT * FROM tabel WHERE condition‘
6,结语
MySQL与Mongodb同样都是在爬虫领域应用广泛的数据库,爬虫推荐非关系型数据库Mongodb它可以避免返回来的数据重新排序并建表的过程,相对来说更加的方便。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)