我们都知道mysql数据库能存储大量数据,但是你知道数据是怎么存储在mysql中的吗?
一般将数据保存到mysql中有两种方式,同步模式和异步模式。
同步模式
同步模式是采用sql语句,将数据插入到数据库中。但是要注意的是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()
异步模式
采用同步模式可能会产生阻塞,我们可以使用twisted将mysql的入库和解析变成异步操作,而不是简单的execute,commit同步操作。
关于mysql的配置,我们可以直接在配置文件配置数据库:
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 mysqldbimport mysqldb.cursorsfrom twisted.enterpriseimport adbapi
使用adbapi可以使mysqldb的一些操作变成异步化的操作
使用cursors进行sql语句的执行和提交
代码部分:
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插入变成异步执行 #runinteraction可以将传入的函数变成异步的 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 #执行具体的插入 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进行执行,并且自动完成commit操作
以上代码部分,除了do_insert之外,其它均可复用。
以上就是数据是怎么存储在mysql?的详细内容。