Swift51.com
麦子学院 头像
麦子学院  2017-08-22 21:59

Python学习之连接数据库异步存储详解

回复:0  查看:3011  
本文和大家分享的主要是python 连接数据库异步存储相关内容,一起来看看吧,希望对大家 学习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,
  }
  完成异步存储, 数据存往数据库的速度与下载的速度差不多快
来源: 博客园