scrapy使用SQLAlchemy插入已存在的表

2019-07-30  本文已影响0人  萌木盖

我也找到有很多scrapy使用SQLAlchemy的文章,但都是现生成表,再插入,我这里的表是别人已经创建好,所以我需要先获取表再插入。
之前也写出来一份,但是有问题,好像因为不是declarative_base这个base(暂时不知道是不是确实是这个原因),而导致异步的时候插入错误,但是如果攒起来,也就是假如到100个再存一下的话,其中一个有问题,这100个全存不进去了,最后成型这个方式,就这样吧,基本实现了。

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
from sqlalchemy import create_engine, Column, Integer, String, Table, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

url = "mysql+pymysql://数据库用户名:密码@ip:端口/库名?charset=utf8mb4"
engine = create_engine(url, echo=False, encoding="utf-8")
Base = declarative_base()
metadata = MetaData(engine)

# 这个暂时没啥用, 也可以按照这种的去改,但是这份儿代码没用到
class User(Base):
    __table__ = Table("User", metadata, autoload=True) # User是表名



class WlcbCloudPipeline(object):

    def open_spider(self, spider):
        self.SessionClass = sessionmaker(bind=engine)  # 利用工厂模式获取SessionClass
        self.session_obj = self.SessionClass()  # 创建session对象,此时已绑定数据库引擎,但是未关联任何的对象模型

        self.User_table = Table("User", metadata, autoload=True)  #  autoload=True这个是关键

    def process_item(self, item, spider):
        self.session_obj.execute(self.User_table.insert(), [item])  # item是{"id":1,"name":"xxx"}
        # self.User_table.insert(id=1, name="2")
        self.session_obj.commit()

        return item

    def close_spider(self, spider):
        self.session_obj.close()
        self.session_obj.commit()
#

上一篇 下一篇

猜你喜欢

热点阅读