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语言定义变量,变量本身代表的就是大小,任何一个字母或者数字 符号均可以 ...
随机推荐
- GridView七十二绝技-大全(收藏版)(转至别人博客)
快速预览:GridView无代码分页排序GridView选中,编辑,取消,删除GridView正反双向排序GridView和下拉菜单DropDownList结合GridView和CheckBox结合鼠 ...
- 《物联网框架ServerSuperIO教程》-22.Web端对传感器实时监测与控制。附:v3.6.8版本,支持WebSocket
1.ServerSuperIO v3.6.8更新内容 1.1 增加WebSocket服务端功能,支持自控模式.并发模式.单例模式,不支持轮询模式1.2 接收数据缓存与现有的IO实例分离.1.3 优化代 ...
- 2017寒假零基础学习Python系列之函数之 函数之定义可变参数
若想让函数接受任意个参数,就可以定义一个可变的参数: def fn(*args): print args fn() >>>() fn(1,2,5,6) >>>(1, ...
- H3CNE实验:配置交换机接口
第1步:配置交换机端口 <H3C>system-view System View: return to User View with Ctrl+Z. [H3C]interface Giga ...
- 计算机浏览器存储技术cookie、sessionStorage、localStorage
HTTP无状态协议是指协议对于事务处理没有记忆能力.会话跟踪协议的状态是指下一次传输可以"记住"这次传输信息的能力,无状态是指同一个会话(注意什么叫同一个会话)的连续两个请求互相不 ...
- voa 2015 / 4 / 25
When English speakers talk about time and place, there are three little words that often come up: in ...
- python cookbook第三版学习笔记十:类和对象(一)
类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair: def __init__(self,x,y): self.x=x self. ...
- SQLServer中的执行计划缓存由于长时间缓存对性能造成的干扰
本文出处:http://www.cnblogs.com/wy123/p/7190785.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- Android - Fragment (一)定义
什么是Fragment,为什么要用Fragment? Fragment,直译为碎片.是Android UI的一种. Fragment加载灵活,替换方便.定制你的UI,在不同尺寸的屏幕上创建合适的UI, ...
- USB的四种传输类型与端点
1.事务 在介绍USB传输类型之前,请允许我先简答介绍一下USB事务. 事务一般由令牌包.数据包(可选).握手包组成. 令牌包:用来启动一个事务,总是由主机发送. 数据包:可以从主机到设备,也可以由设 ...