Python3爬虫(九) 数据存储之关系型数据库MySQL

2018-06-18 02:42:38来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Python3爬虫(八) 数据存储之TXT、JSON、CSV

下一篇:PyCharm导入pymysql包运行报错问题解决:No module named 'P