Python3爬虫 数据存储之关系型数据库MySQL
Posted Infi_chu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3爬虫 数据存储之关系型数据库MySQL相关的知识,希望对你有一定的参考价值。
Infi-chu:
http://www.cnblogs.com/Infi-chu/
关系型数据库
关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以关系型数据库的存储方式就是行列组成的表。
每一列是一个字段,每一行是一条记录。
表可以看成是摸个实体的集合,而实体之间存在关系,比如主键和外键
常见的关系型数据库有:Oracle、MySQL、SQLite、SQL Server、DB2等
MySQL
在Python2中,MySQL的链接库是MySQLdb,
而在Python3中,官方不支持使用MySQLdb,Python3中使用的是PyMySQL
1.连接数据库
import pymysql db = pymysql.connect(host=\'127.0.0.1\',user=\'root\',password=\'123456\',port=3306) cursor=db.cursor() cursor.execute(\'SELETE VERSION()\') # 使用execute方法执行SQL语句 data = cursor.fetchone() # 使用fetchone()方法获得第一条数据 print(\'Version is :\',data) cursor.execute(\'CREATE DATABASE spiders DEFAULT CHARCTER SET uft-8\') # 创建spiders数据库,默认编码为UTF-8 db.close()
2.创建表
import pymysql db = pymysql.connect(host=\'127.0.0.1\',user=\'root\',password=\'123456\',port=3306,db=\'spiders\') cursor = db.cursor() sql = \'CREATE TABLE IF NOT EXISTS tests (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))\' cursor.execute(sql) db.close()
【注】
在实际的爬虫项目中要根据实际情况设计数据库
3.插入数据
import pymysql id = \'123\' user = \'Infichu\' age = 23 db = pymysql.connect(host=\'127.0.0.1\',user=\'root\',password=\'123456\',port=3306,db=\'spiders\') cursor = db.cursor() sql = \'INSERT INTO tests(id,name,age) values(%s,%s,%s)\' try: cursor.execute(sql,(id,user,age)) db.commit() # commit()方法,数据库提交 except: db.rollback() # rollback(),数据库回滚 db.close()
事物的4个属性
属性 描述
原子性(atomicity) 事物是一个不可分割的工作单位,事物中包括的很多操作要么做,要么不做
一致性(consistency) 事物必须使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的
隔离性(isolation) 一个事物的执行不能被其他事物干扰
持久性(durability) 持续性,一个事物一旦提交,他对数据库中数据的改变就应该是永久性的。之后的操作或故障不会对其造成影响
# 通用插入方法 import pymysql data = { \'id\':\'1\', \'name\':\'Infi-chu\', \'age\':23 } table = \'tests\' 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\') except: print(\'Failed\') db.rollback() db.close()
4.更新数据
sql = \'UPDATE tests SET age=%s WHERE name=%s\' try: cursor.execute(sql,(25,\'Infi-chu\')) db.commit() except: db.rollback() db.close()
# 通用更新方法
import pymysql
data = {
\'id\':\'1\',
\'name\':\'Infi-chu\',
\'age\':23
}
table = \'tests\'
keys = \', \'.join(data.keys())
values = \', \'.join([\'%s\']*len(data))
# ON DUPLICATE KEY UPDATE 表示如果主键已经存在,就执行更新操作
sql = \'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE\'.format(table=table,keys=keys,values=values)
update = \',\'.join([" {keys}=%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()
5.删除数据:
table = \'tests\' condition = \'age>20\' sql = \'DELETE FROM {table} WHERE {condition}\'.format(table=table,condition=condition) try: cursor.execute(sql) db.commit() except: cursor.rollback() db.close()
6.查询数据:
sql = \'SELECT * FROM tests 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\')
以上是关于Python3爬虫 数据存储之关系型数据库MySQL的主要内容,如果未能解决你的问题,请参考以下文章
Python3网络爬虫实战-33数据存储:非关系型数据库存储:MongoDB
Python3网络爬虫实战-32数据存储:关系型数据库存储:MySQL
Python3网络爬虫实战-34数据存储:非关系型数据库存储:Redis