美文网首页
scrapy使用SQLAlchemy插入已存在的表

scrapy使用SQLAlchemy插入已存在的表

作者: 萌木盖 | 来源:发表于2019-07-30 14:26 被阅读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()
    #
    
    

    相关文章

      网友评论

          本文标题:scrapy使用SQLAlchemy插入已存在的表

          本文链接:https://www.haomeiwen.com/subject/fufnrctx.html