美文网首页
Mysql数据库的写入

Mysql数据库的写入

作者: 我想回精神病院住 | 来源:发表于2018-11-26 00:21 被阅读0次

    Mysql数据库的写入

    异步写入
    数据库的异步写入操作。因为execute()及commit()提交数据库的方式是同步插入数据,一旦数据量比较大,scrapy的解析是异步多线程的方式,解析速度非常快,而数据库的写入速度比较慢,可能会导致item中的数据插入数据库不及时,造成数据库写入的阻塞,最终导致数据库卡死或者数据丢失。
    class MySQLTwistedPipeline(object):
    def init(self, dbpool):
    # 初始化线程池对象,用于维护操作mysql写入操作的线程
    self.dbpool = dbpool
    # from_settings()函数是固定写法,该函数是用于读取settings.py配置信息的函数,第二个参数settings是一个字典。
    # 可以先在setting文件中设置数据库连接的配置信息
    # MYSQL_HOST = 'localhost'
    # MYSQL_DBNAME = 'article_db'
    # MYSQL_USER = 'root'
    # MYSQL_PASSWORD = '123456'
    # MYSQL_CHARSET = 'utf8'
    @classmethod
    def from_settings(cls, settings):
    args = dict(
    host=settings['MYSQL_HOST'],
    db=settings['MYSQL_DBNAME'],
    user=settings['MYSQL_USER'],
    passwd=settings['MYSQL_PASSWORD'],
    charset=settings['MYSQL_CHARSET'],
    # 指定用用于创建cursor游标的类
    cursorclass=MySQLdb.cursors.DictCursor,
    )
    # 创建一个线程池对象
    # 参数1:用于连接MySQL数据库的驱动
    # 参数2:数据库的链接信息(host, port, user等)
    dbpool = adbapi.ConnectionPool("MySQLdb", **args)

        return cls(dbpool)
    def process_item(self, item, spider):
        # 在线程池dbpool中通过调用runInteraction()函数,来实现异步插入数据的操作。runInteraction()会insert_sql交由线程池中的某一个线程执行具体的插入操作。
        query = self.dbpool.runInteraction(self.insert, item)
        # addErrorback()数据库异步写入失败时,会执行addErrorback()内部的函数调用。
        query.addErrback(self.handler_error)
    
    def handler_error(self, failure):
        print u'数据库插入数据失败:',failure
    
    def insert(self, cursor, item):
        insert_sql = 'insert into jobbole (title, date_time, detail_url, url_object_id, img_src, img_path, ping_lun, shou_cang, dian_zan, tags, content) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
        cursor.execute(insert_sql, (item['title'], item['date_time'], item['detail_url'], item['url_object_id'], item['img_src'], item['img_path'], item['ping_lun'], item['shou_cang'], item['dian_zan'], item['tags'], item['content']))
        # 不需要执行commit()的操作了,会在线程池中自动指定提交的操作。
    

    相关文章

      网友评论

          本文标题:Mysql数据库的写入

          本文链接:https://www.haomeiwen.com/subject/flqvqqtx.html