数据存储在mysql的两种方式

  

,,,,,,,,,,

一般将数据保存到MySQL中有两种方式,同步模式和异步模式。

同步模式是采用SQL语句,将数据插入到数据库中。但是要注意的是Scrapy的解析速度要远大于MySQL的入库速度,当有大量解析的时候,MySQL的入库就可能会阻塞。

进口MySQLdbclass MysqlPipeline(对象):   def __init__(自我):   自我。康涅狄格州=MySQLdb.connect(& # 39; 127.0.0.1 # 39; & # 39;根# 39;,& # 39;根# 39;,& # 39;article_spider& # 39;, charset=皍tf8", use_unicode=True)   自我。光标=self.conn.cursor () def process_item(自我,物品,蜘蛛):   insert_sql=?”;“   插入jobbole_article(标题、create_date url, url_object_id)值(% s, % s % s, % s)   “““   self.cursor.execute (insert_sql,(项目(“title")项目(“create_date")项目(“url")项目(“url_object_id")))   self.conn.commit ()


采用同步模式可能会产生阻塞,我们可以使用扭曲将MySQL的入库和解析变成异步操作,而不是简单的执行,提交同步操作。

数据存储在MySQL的两种方式

关于MySQL的配置,我们可以直接在配置文件配置数据库:

MYSQL_HOST=?27.0.0.1"   MYSQL_DBNAME=癮rticle_spider"   MYSQL_USER=皉oot" MYSQL_PASSWORD=皉oot"

在设置中的配置,我们通过在管道中定义from_settings获取设置对象,可以直接获取设置配置文件中的值。

使用扭曲提供的异步容器连接MySQL:

进口MySQLdb   进口MySQLdb。cursorsfrom twisted.enterprise   进口adbapi

使用adbapi可以使mysqldb的一些操作变成异步化的操作
使用游标进行sql语句的执行和提交

代码部分:

类MysqlTwistedPipline(对象):   def __init__(自我,dbpool):   自我。dbpool=dbpool @classmethod   def from_settings (cls、设置):   dbparms=dict (   主机=设置(“MYSQL_HOST"),   db=设置(“MYSQL_DBNAME"),   用户=设置(“MYSQL_USER"),   passwd=设置(“MYSQL_PASSWORD"),   charset=& # 39; use utf8 # 39;   cursorclass=MySQLdb.cursors.DictCursor,   use_unicode=True,   )   dbpool=adbapi.ConnectionPool (“MySQLdb", * * dbparms)返回cls (dbpool) def process_item(自我,物品,蜘蛛):   #使用扭曲将mysql插入变成异步执行   # runInteraction可以将传入的函数变成异步的   查询=self.dbpool.runInteraction (self.do_insert项)#处理异常   query.addErrback (self.handle_error,项,蜘蛛)def handle_error(自我,失败,项目,蜘蛛):   #处理异步插入的异常   打印(失败)def do_insert(自我、光标、项目):   #会从dbpool取出游标   #执行具体的插入   insert_sql=?”;“   插入jobbole_article(标题、create_date url, url_object_id)值(% s, % s % s, % s)   “““   游标。执行(insert_sql,(项目(“title")项目(“create_date")项目(“url")项目(“url_object_id"))) #拿传进的光标进行执行,并且自动完成提交操作

以上代码部分,除了do_insert之外,其它均可复用。

数据存储在mysql的两种方式