加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

推荐数据存储在mysql的两种方式

发布时间:2023-10-18 15:42:09 所属栏目:MySql教程 来源:
导读:一般将数据保存到MySQL中有两种方式,同步模式和异步模式。

同步模式

同步模式是采用SQL语句,将数据插入到数据库中。但是要注意的是Scrapy的解析速度要远大于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的配置,我们可以直接在配置文件配置数据库:
 
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语句的执行和提交
 
代码部分:
 
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之外,其它均可复用。
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章