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