python连接数据库异步存储
当同步写入数据库时,可能会发生下载速度很快,但是写入速度很慢的情况,因此我们采用异步存储写入数据库.
实现异步写入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连接数据库异步存储的更多相关文章
- python—Celery异步分布式
python—Celery异步分布式 Celery 是一个python开发的异步分布式任务调度模块,是一个消息传输的中间件,可以理解为一个邮箱,每当应用程序调用celery的异步任务时,会向brok ...
- 使用异步存储提升 Web 应用程序的离线体验
localForage 是一个 JavaScript 库,通过使用简单的.类似 localStorage 风格的 API 实现异步存储,帮助你提升 Web 应用程序的离线经验(通过 IndexedDB ...
- Python开源异步并发框架
Python开源异步并发框架的未来 2014年3月30日,由全球最大的中文IT社区CSDN主办的“开源技术大会·” (Open Source Technology Conference ,简称OSTC ...
- React Native 异步存储
异步存储 http://blog.csdn.net/yulianlin/article/details/52473456
- (转)Python黑魔法 --- 异步IO( asyncio) 协程
转自:http://www.jianshu.com/p/b5e347b3a17c?from=timeline Python黑魔法 --- 异步IO( asyncio) 协程 作者 人世间 关注 201 ...
- python连接数据库问题小结
在使用python连接数据库的时候遇到了这个问题: 大概意思就是在django的setting.py中配置的用户名和密码报错. 主要就是修改setting.py的配置 其中在里边的name和user项 ...
- 3.Python连接数据库PyMySQL
1.安装PyMySQL,输入命令:pip3 install PyMySQL 2.使用Navicat,创建数据库:TESTDB,表:EMPLOYEE,字段:FIRST_NAME,LAST_NAME,AG ...
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- C语言和Python语言在存储变量方面的不同
C语言和Python语言在存储变量方面的不同 众所周知,Python是脚本语言,边解释边执行,而C语言是编译型语言 存储变量: C语言定义变量,变量本身代表的就是大小,任何一个字母或者数字 符号均可以 ...
随机推荐
- alibaba druid 在springboot start autoconfig 下的bug
alibaba druid 在springboot start autoconfig下的bug 标签(空格分隔):druid springboot start autoconfig 背景 发现.分析过 ...
- (转载)WebSphere MQ安装过程
参考文档: http://www.ibm.com/developerworks/cn/linux/linux-speed-start/l-ss-mq/
- 跟我一起读postgresql源码(六)——Executor(查询执行模块之——查询执行策略)
时光荏苒,岁月如梭.楼主已经很久没有更新了.之前说好的一周一更的没有做到.实在是事出有因,没能静下心来好好看代码.当然这不能作为我不更新的理由,时间挤挤还是有的,拖了这么久,该再写点东西了,不然人就怠 ...
- Android 动画——Frame Animation与Tween Animation
很多手机应用的引导页都是动画的,添加动画后的应用画面会更加生动灵活,今天博主也学习了Android中Animation的使用,下面来总结下. android中的Animation分为两种,一种是Fr ...
- shiro整合oauth
一.基本思路脑图 二.客户端shiro配置 shiro配置文件 <?xml version="1.0" encoding="UTF-8"?> < ...
- CJOJ 1494 【网络流24题】 搭配飞行员(二分图最大匹配)
CJOJ 1494 [网络流24题] 搭配飞行员(二分图最大匹配) Description 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾 ...
- 使用mysqldump备份数据库
#! /bin/shday_str=`date +%j`day=`date +%Y%m%d`days_str=`echo "$day_str % 60"|bc`cd /home/d ...
- python机器学习模块安装
环境:RHEL6.5 离线安装 ############################################################################ 一,本地yum ...
- zookeeper的集群介绍、搭建、环境、安装
zookeeper是本身是一种分布式协调服务(英文意思动物园园长因为Hadoop就是一个动物园,storm.hadoop.kafkaka.hbaser都是基于zookeeper开发的) 原理:Zook ...
- input复选框操作的部分高频率使用代码
1. 获取单个checkbox选中项(三种写法): $("input:checkbox:checked").val() 或者 $("input:[type='checkb ...