python连接数据库异步存储

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

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

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

在settings设置连接信息

1 MYSQL_HOST = ‘127.0.0.1‘
2 MYSQL_DBNAME = ‘testdb‘
3 MYSQL_USER = ‘root‘
4 MYSQL_PASSWD = ‘123456‘
5 MYSQL_CHARSET="UTF8"
6
7 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,

}

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

时间: 2024-10-13 23:11:43

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

[Python]sqlite3二进制文件存储问题(BLOB)(You must not use 8-bit bytestrings unless you use a text_factory...)

事情是这样的: 博主尝试用Python的sqlite3数据库存放加密后的用户名密码信息,表是这样的 CREATE TABLE IF NOT EXISTS user ( userID INTEGER PRIMARY KEY AUTOINCREMENT, userStudentID BLOB NOT NULL UNIQUE ON CONFLICT IGNORE, userPassword BLOB NOT NULL ); 其中userStudentID and UserPassword 储存成了BL

Python 开源异步并发框架的未来(转)

Python 开源异步并发框架的未来 fantix 1.1k 2014年04月16日 发布 推荐 4 推荐 收藏 31 收藏,8.9k 浏览 呵呵,这个标题有点大,其实只是想从零开始介绍一下异步的基础,以及 Python 开源异步并发框架的发展和互操作性. 另外,这是我在 OSTC 2014 做的一个 20140330-OSTC-分论坛1王川 http://v.youku.com/v_show/id_XNjk2ODI0ODQ4.html ,幻灯片在这里,欢迎拍砖. 开源 Python 是开源的,

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

localForage 是一个 JavaScript 库,通过使用简单的.类似 localStorage 风格的 API 实现异步存储,帮助你提升 Web 应用程序的离线经验(通过 IndexedDB 或 WebSQL). localForage 同时支持回调和 Promises 模式两个 API,你可以根据自己的喜好进行选择. 您可能感兴趣的相关文章 Web 开发中很实用的10个效果[附源码下载] 精心挑选的优秀jQuery Ajax分页插件和教程 12款经典的白富美型 jQuery 图片轮播

Python开源异步并发框架

Python开源异步并发框架的未来 2014年3月30日,由全球最大的中文IT社区CSDN主办的“开源技术大会·2014” (Open Source Technology Conference 2014,简称OSTC 2014)在北京丽亭华苑酒店召开. 本次大会以“启蒙·开源”(Open Mind, Open Source)为主题,邀请到了来自全国各地的30多位开源业界资深人士发表主题演讲,数十个开源社区现场参与,到场的开源软件开发者.贡献者和开源爱好 者总人数超过500人.作为一场“接地气”的

Socket异步存储示例

异步客户端存储示例: using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.Text; // State object for receiving data from remote device. public class StateObject { // Client socket. public Socket workSocket = null; // Si

一文教你Python Web异步框架

? 时间过得真快,转眼之间已经是2019年了.好几年前,做web开发时,我们选择了Python的tornado框架,看重的是它的轻量级(简洁)和异步(说实话,没怎么用异步). 后来,开始用Python 3,同时也接触了asyncio,对异步IO有了跟深入的理解和掌握.asyncio模块提供了在单线程上通过协程实现并发的基础框架,复用网络sockets和其它资源上的IO访问.简单说,就是在读写网络.文件等IO设备时通过并发来提高性能. ? 写爬虫也用asyncio替换了原来的gevent,最明显的

Windows下Python连接数据库(mysql, mongodb)

一 实验平台 1 os: win7 64位旗舰版sp1 2 python: 2.7.10 x64 二 连接数据库 1 连接 mysql数据库 (1)下载mysql(5.6.25-winx64) 建议下载免安装版, 安装版的容易出现各种问题,解开压缩包,双击bin目录下的mysqld.exe, 启动数据库服务进程, 要关闭的话, 直接到任务管理器里面干掉这个进程就行了 (2)下载并安装navicat(这是一个mysql可视化管理工具, 不是必须的, 但可以方便在用python执行数据库操作的时候,

python之异步IO

协程的用武之地 并发量较大的系统和容易在IO方面出现瓶颈(磁盘IO,网络IO),采用多线程.多进程可以解决这个问题,当然线程.进程的切换时很消耗资源的.最好的解决方案是使用单线程方式解决并发IO问题--这就是协程发挥作用之处. 协程其实就是单线程在调度,是无法利用多核CPU,所以对于计算密集型的任务还是需要考虑多进程+协程的方式. 参考: http://blog.csdn.net/qq910894904/article/details/41699541 http://www.cnblogs.co

python数据的存储和持久化操作

Python的数据持久化操作主要是六类:普通文件.DBM文件.Pickled对象存储.shelve对象存储.对象数据库存储.关系数据库存储. 普通文件不解释了,DBM就是把字符串的键值对存储在文件里: Python代码 % python >>> import anydbm >>> file = anydbm.open('movie', 'c') # make a DBM file called 'movie' >>> file['Batman'] =