当同步写入数据库时,可能会发生下载速度很快,但是写入速度很慢的情况,因此我们采用异步存储写入数据库.

实现异步写入mysql数据库的思路:

1,将数据库的连接数据写入到settings文件中,供后面自定义的pipeline使用
    2,自定义pipeline,使用Twisted框架实现异步
    3,在settings中注册这个管道

在settings设置连接信息

 MYSQL_HOST = '127.0.0.1'
MYSQL_DBNAME = 'testdb'
MYSQL_USER = 'root'
MYSQL_PASSWD = ''
MYSQL_CHARSET="UTF8" MYSQL_PORT = 3306

在pipeline自定义一个新的类来实现异步存储

from MySQLdb.cursors import DictCursor
from twisted.enterprise import adbapi
class MySQLAsynPipeline(object): def __init__(self,dbpool):
#定义连接池为对象函数
self.dbpool=dbpool
query = self.dbpool.runInteraction(self.create_table)
#创建存储表
def create_table(self,cursor):
sql = "create table if not exists test (id INT PRIMARY KEY auto_increment NOT NULL , title VARCHAR(50) NOT NULL,category_name VARCHAR (100),date_time VARCHAR (20) NOT NULL ,likes INT DEFAULT 0,content longtext ,comment INT DEFAULT 0,collect INT DEFAULT 0,detail_url VARCHAR (255) UNIQUE,src VARCHAR (255))"
cursor.execute(sql) #自动调用的,只调用一次
#从settings.py中根据字段加载对应的文件
@classmethod
def from_settings(cls, settings): #POOL池子,con:连接
#参数1:dbapiName 数据库接口名称
#参数2:*connargs *args
#参数3:*connkw **kwargs
#将setting中连接数据库所需内容取出
config = dict(
host=settings['MYSQL_HOST'],
db = settings['MYSQL_DBNAME'],
user = settings['MYSQL_USER'],
passwd =settings['MYSQL_PASSWD'],
charset = settings['MYSQL_CHARSET'],
port = settings['MYSQL_PORT'],
cursorclass = DictCursor,
)
#通过Twisted框架提供的容器连接数据库
dbpool = adbapi.ConnectionPool(
"MySQLdb", **config
) #cls把参数给__init__
return cls(dbpool)
#roll back:回滚
#commit:提交
#事务:如果所有语句都执行正确,才真正执行,只要有一条数据出错,可以通过回滚撤销所有操作 #开启事务
# 尝试执行多条sql语句
#没问题 commit
#有问题 roll back
#关闭事务
def process_item(self, item, spider):
#runInteraction:运行交互
query =self.dbpool.runInteraction(self.insert_sql,item)
#当执行过程中出现错误,执行adderrback
query.addErrback(self.insert_error, item, spider)
return item def insert_error(self,failed):
print ">>>>>>>>>>>",failed def insert_sql(self,cursor, item):
#执行具体的插入语句,不需要commit操作,Twisted会自动进行
sql = "insert into test (title,category_name, date_time,likes,content, comment,collect, detail_url,src) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)"
cursor.execute(sql, (
item['title'], item['category_name'], item['date_time'], item['likes'], item['content'], item['comment'],
item['collect'], item['detail_url'], item['src'][0])

在settings里注册:

ITEM_PIPELINES = {
#Mysql异步写入
"JobboleSpider.pipelines.MySQLAsynPipeline": 2, }

完成异步存储,数据存往数据库的速度与下载的速度差不多快

python连接数据库异步存储的更多相关文章

  1. python—Celery异步分布式

    python—Celery异步分布式 Celery  是一个python开发的异步分布式任务调度模块,是一个消息传输的中间件,可以理解为一个邮箱,每当应用程序调用celery的异步任务时,会向brok ...

  2. 使用异步存储提升 Web 应用程序的离线体验

    localForage 是一个 JavaScript 库,通过使用简单的.类似 localStorage 风格的 API 实现异步存储,帮助你提升 Web 应用程序的离线经验(通过 IndexedDB ...

  3. Python开源异步并发框架

    Python开源异步并发框架的未来 2014年3月30日,由全球最大的中文IT社区CSDN主办的“开源技术大会·” (Open Source Technology Conference ,简称OSTC ...

  4. React Native 异步存储

    异步存储 http://blog.csdn.net/yulianlin/article/details/52473456

  5. (转)Python黑魔法 --- 异步IO( asyncio) 协程

    转自:http://www.jianshu.com/p/b5e347b3a17c?from=timeline Python黑魔法 --- 异步IO( asyncio) 协程 作者 人世间 关注 201 ...

  6. python连接数据库问题小结

    在使用python连接数据库的时候遇到了这个问题: 大概意思就是在django的setting.py中配置的用户名和密码报错. 主要就是修改setting.py的配置 其中在里边的name和user项 ...

  7. 3.Python连接数据库PyMySQL

    1.安装PyMySQL,输入命令:pip3 install PyMySQL 2.使用Navicat,创建数据库:TESTDB,表:EMPLOYEE,字段:FIRST_NAME,LAST_NAME,AG ...

  8. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  9. C语言和Python语言在存储变量方面的不同

    C语言和Python语言在存储变量方面的不同 众所周知,Python是脚本语言,边解释边执行,而C语言是编译型语言 存储变量: C语言定义变量,变量本身代表的就是大小,任何一个字母或者数字 符号均可以 ...

随机推荐

  1. alibaba druid 在springboot start autoconfig 下的bug

    alibaba druid 在springboot start autoconfig下的bug 标签(空格分隔):druid springboot start autoconfig 背景 发现.分析过 ...

  2. (转载)WebSphere MQ安装过程

    参考文档: http://www.ibm.com/developerworks/cn/linux/linux-speed-start/l-ss-mq/

  3. 跟我一起读postgresql源码(六)——Executor(查询执行模块之——查询执行策略)

    时光荏苒,岁月如梭.楼主已经很久没有更新了.之前说好的一周一更的没有做到.实在是事出有因,没能静下心来好好看代码.当然这不能作为我不更新的理由,时间挤挤还是有的,拖了这么久,该再写点东西了,不然人就怠 ...

  4. Android 动画——Frame Animation与Tween Animation

    很多手机应用的引导页都是动画的,添加动画后的应用画面会更加生动灵活,今天博主也学习了Android中Animation的使用,下面来总结下.  android中的Animation分为两种,一种是Fr ...

  5. shiro整合oauth

    一.基本思路脑图 二.客户端shiro配置 shiro配置文件 <?xml version="1.0" encoding="UTF-8"?> < ...

  6. CJOJ 1494 【网络流24题】 搭配飞行员(二分图最大匹配)

    CJOJ 1494 [网络流24题] 搭配飞行员(二分图最大匹配) Description 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾 ...

  7. 使用mysqldump备份数据库

    #! /bin/shday_str=`date +%j`day=`date +%Y%m%d`days_str=`echo "$day_str % 60"|bc`cd /home/d ...

  8. python机器学习模块安装

    环境:RHEL6.5 离线安装 ############################################################################ 一,本地yum ...

  9. zookeeper的集群介绍、搭建、环境、安装

    zookeeper是本身是一种分布式协调服务(英文意思动物园园长因为Hadoop就是一个动物园,storm.hadoop.kafkaka.hbaser都是基于zookeeper开发的) 原理:Zook ...

  10. input复选框操作的部分高频率使用代码

    1. 获取单个checkbox选中项(三种写法): $("input:checkbox:checked").val() 或者 $("input:[type='checkb ...