您好,登錄后才能下訂單哦!
下文主要給大家?guī)頂?shù)據(jù)存儲在mysql的兩種方式,希望這些內(nèi)容能夠帶給大家實際用處,這也是我編輯數(shù)據(jù)存儲在mysql的兩種方式這篇文章的主要目的。好了,廢話不多說,大家直接看下文吧。
一般將數(shù)據(jù)保存到MySQL中有兩種方式,同步模式和異步模式。
同步模式
同步模式是采用SQL語句,將數(shù)據(jù)插入到數(shù)據(jù)庫中。但是要注意的是Scrapy的解析速度要遠大于MySQL的入庫速度,當有大量解析的時候,MySQL的入庫就可能會阻塞。
import MySQLdbclass MysqlPipeline(object): def __init__(self): self.conn = MySQLdb.connect('127.0.0.1','root','root','article_spider',charset="utf8",use_unicode=True) self.cursor = self.conn.cursor() def process_item(self, item, spider): insert_sql = """ insert into jobbole_article(title,create_date,url,url_object_id) VALUES (%s,%s,%s,%s) """ self.cursor.execute(insert_sql,(item["title"],item["create_date"],item["url"],item["url_object_id"])) self.conn.commit()
異步模式
采用同步模式可能會產(chǎn)生阻塞,我們可以使用Twisted將MySQL的入庫和解析變成異步操作,而不是簡單的execute,commit同步操作。
關于MySQL的配置,我們可以直接在配置文件配置數(shù)據(jù)庫:
MYSQL_HOST = "127.0.0.1" MYSQL_DBNAME = "article_spider" MYSQL_USER = "root"MYSQL_PASSWORD = "root"
在settings中的配置,我們通過在pipeline中定義from_settings獲取settings對象,可以直接獲取settings配置文件中的值。
使用Twisted提供的異步容器連接MySQL:
import MySQLdb import MySQLdb.cursorsfrom twisted.enterprise import adbapi
使用adbapi可以使mysqldb的一些操作變成異步化的操作
使用cursors進行sql語句的執(zhí)行和提交
代碼部分:
class MysqlTwistedPipline(object): def __init__(self,dbpool): self.dbpool = dbpool @classmethod def from_settings(cls,settings): dbparms = dict( host = settings["MYSQL_HOST"], db = settings["MYSQL_DBNAME"], user = settings["MYSQL_USER"], passwd = settings["MYSQL_PASSWORD"], charset = 'utf8', cursorclass = MySQLdb.cursors.DictCursor, use_unicode=True, ) dbpool = adbapi.ConnectionPool("MySQLdb",**dbparms) return cls(dbpool) def process_item(self, item, spider): #使用Twisted將mysql插入變成異步執(zhí)行 #runInteraction可以將傳入的函數(shù)變成異步的 query = self.dbpool.runInteraction(self.do_insert,item) #處理異常 query.addErrback(self.handle_error,item,spider) def handle_error(self,failure,item,spider): #處理異步插入的異常 print(failure) def do_insert(self,cursor,item): #會從dbpool取出cursor #執(zhí)行具體的插入 insert_sql = """ insert into jobbole_article(title,create_date,url,url_object_id) VALUES (%s,%s,%s,%s) """ cursor.execute(insert_sql, (item["title"], item["create_date"], item["url"], item["url_object_id"])) #拿傳進的cursor進行執(zhí)行,并且自動完成commit操作
以上代碼部分,除了do_insert之外,其它均可復用。
對于以上關于數(shù)據(jù)存儲在mysql的兩種方式,大家是不是覺得非常有幫助。如果需要了解更多內(nèi)容,請繼續(xù)關注我們的行業(yè)資訊,相信你會喜歡上這些內(nèi)容的。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。