温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

数据存储在mysql的两种方式

发布时间:2020-05-12 16:16:25 来源:亿速云 阅读:510 作者:三月 栏目:MySQL数据库

下文主要给大家带来数据存储在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之外,其它均可复用。

对于以上关于数据存储在mysql的两种方式,大家是不是觉得非常有帮助。如果需要了解更多内容,请继续关注我们的行业资讯,相信你会喜欢上这些内容的。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI