python連接數據庫異步存儲


當同步寫入數據庫時,可能會發生下載速度很快,但是寫入速度很慢的情況,因此我們采用異步存儲寫入數據庫.     

實現異步寫入mysql數據庫的思路:    

    1,將數據庫的連接數據寫入到settings文件中,供后面自定義的pipeline使用
    2,自定義pipeline,使用Twisted框架實現異步
    3,在settings中注冊這個管道

在settings設置連接信息

 

1 MYSQL_HOST = '127.0.0.1'
2 MYSQL_DBNAME = 'testdb'
3 MYSQL_USER = 'root'
4 MYSQL_PASSWD = '123456'
5 MYSQL_CHARSET="UTF8"
6 
7 MYSQL_PORT = 3306

 

在pipeline自定義一個新的類來實現異步存儲

from MySQLdb.cursors import DictCursor
from twisted.enterprise import adbapi
class MySQLAsynPipeline(object):

    def __init__(self,dbpool):
#定義連接池為對象函數 self.dbpool
=dbpool query = self.dbpool.runInteraction(self.create_table) #創建存儲表 def create_table(self,cursor): sql = "create table if not exists test (id INT PRIMARY KEY auto_increment NOT NULL , title VARCHAR(50) NOT NULL,category_name VARCHAR (100),date_time VARCHAR (20) NOT NULL ,likes INT DEFAULT 0,content longtext ,comment INT DEFAULT 0,collect INT DEFAULT 0,detail_url VARCHAR (255) UNIQUE,src VARCHAR (255))" cursor.execute(sql) #自動調用的,只調用一次 #從settings.py中根據字段加載對應的文件 @classmethod def from_settings(cls, settings): #POOL池子,con:連接 #參數1:dbapiName 數據庫接口名稱 #參數2:*connargs *args #參數3:*connkw **kwargs
#將setting中連接數據庫所需內容取出
config = dict( host=settings['MYSQL_HOST'], db = settings['MYSQL_DBNAME'], user = settings['MYSQL_USER'], passwd =settings['MYSQL_PASSWD'], charset = settings['MYSQL_CHARSET'], port = settings['MYSQL_PORT'], cursorclass = DictCursor, ) #通過Twisted框架提供的容器連接數據庫 dbpool = adbapi.ConnectionPool( "MySQLdb", **config ) #cls把參數給__init__ return cls(dbpool) #roll back:回滾 #commit:提交 #事務:如果所有語句都執行正確,才真正執行,只要有一條數據出錯,可以通過回滾撤銷所有操作 #開啟事務 # 嘗試執行多條sql語句 #沒問題 commit #有問題 roll back #關閉事務 def process_item(self, item, spider): #runInteraction:運行交互 query =self.dbpool.runInteraction(self.insert_sql,item) #當執行過程中出現錯誤,執行adderrback query.addErrback(self.insert_error, item, spider) return item def insert_error(self,failed): print ">>>>>>>>>>>",failed def insert_sql(self,cursor, item):
#執行具體的插入語句,不需要commit操作,Twisted會自動進行 sql
= "insert into test (title,category_name, date_time,likes,content, comment,collect, detail_url,src) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)" cursor.execute(sql, ( item['title'], item['category_name'], item['date_time'], item['likes'], item['content'], item['comment'], item['collect'], item['detail_url'], item['src'][0])

在settings里注冊:

ITEM_PIPELINES = {
    #Mysql異步寫入
    "JobboleSpider.pipelines.MySQLAsynPipeline": 2,

}

完成異步存儲,數據存往數據庫的速度與下載的速度差不多快

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM