【问题标题】:Saving data into db using SqlAlchemy, object is not subscriptable使用 SqlAlchemy 将数据保存到数据库中,对象不可下标
【发布时间】:2015-04-14 14:43:44
【问题描述】:

我正在尝试将一些数据插入数据库,不幸的是它失败并且没有保存,我怀疑我的数据结构不正确。在尝试保存“打印(标题,链接,日期)”之前,数据在 process_item 中很好地打印(每个对象 1 个标题、链接和日期),但是它无法保存。标题、链接和日期各有 1 个字符串...

感谢您的帮助


错误:

"Traceback (most recent call last):
  File "spider.py", line 63, in <module>
    presstv = spider_html(presstv_url, presstv_extract_item, presstv_xpath, presstv_pipeline)
  File "spider.py", line 58, in spider_html
    pipeline.process_item(extract_function(element), None)
  File "/Users/dav/Projects/python/news/pipeline.py", line 76, in process_item
    if session.query(Presstv).filter_by(link=item['link']) == None:
TypeError: 'Presstv' object is not subscriptable"



代码

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Nordfront, Presstv, db_connect, create_presstv_table
import json



class PresstvPipeline(object):
    """Pipeline for storing scraped items in the database"""
    def __init__(self):
        """
        Initializes database connection and sessionmaker.
        Creates deals table.
        """
        engine = db_connect()
        create_presstv_table(engine)
        self.Session = sessionmaker(bind=engine)


    def process_item(self, items, spider):

        session = self.Session()


        for title, link, date in zip(items['title'], items['link'], items['date']):

            print(title, link, date)
            item = Presstv(title = title, link = link, date = date)


            if session.query(Presstv).filter_by(link=item['link']) == None:
                try:
                    session.add(item)
                    session.commit()
                    logger.info('Item saved')
                except:
                    session.rollback()
                    raise
                finally:
                    session.close()

                return item



型号:

class Presstv(DeclarativeBase):
    """Sqlalchemy deals model"""
    __tablename__ = "presstv"

    id = Column(Integer, primary_key=True)
    title = Column('title', String)
    description = Column('description', String, nullable=True)
    link = Column('link', String, unique=True)
    date = Column('date', String, nullable=True)
    created_at = Column('created_at', DateTime, default=_get_date)

【问题讨论】:

    标签: python python-3.x sqlalchemy


    【解决方案1】:

    你应该使用:

    if session.query(Presstv).filter_by(link=item.link) == None:
    

    item 现在是来自 SQLAlchemy 的对象。这可能是因为您在几行之前使用了items['link'],但item 现在是该类的一个实例,因此您应该使用.link 访问它的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多