开发者社区> 问答> 正文

InterfaceError:(sqlte3.InterfaceError)Er?400报错

InterfaceError:(sqlte3.InterfaceError)Error binding parameter 0? 400 报错

最近在学习scrapy爬虫,爬取别人博客上的文章标题。如果不加数据库,能够很好的输出结果,虽然排版不好看,但是使用sqlalchemy存储数据,一直出错,错误提示所图片所示:

我的item['title']是通过以下的解析式来的:

item['title'] = sel.xpath('//*[@class="link_title"]/a/text()').extract()



我的sqlalchemy model定义了表,内容如下:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
DeclarativeBase = declarative_base()

def db_connect():
    return create_engine('sqlite:///./sqlalchemy.db',echo = True)

def create_myblog_table(engine):
    DeclarativeBase.metadata.create_all(engine)

class MyBlog(DeclarativeBase):
    __tablename__ = 'myblog'

    id = Column(Integer, primary_key = True)
    title = Column('title', String(200))



我的pipeleine里面是这样写的:

from sqlalchemy.orm import sessionmaker
from model import MyBlog, db_connect, create_myblog_table


class MyblogPipeline(object):
    def __init__(self):
        engine = db_connect()
        create_myblog_table(engine)
        self.Session = sessionmaker(bind = engine)

    def process_item(self, item, spider):
        session = self.Session()
        myblog=MyBlog(**item)
        session.add(myblog)
        session.commit()
        return item



我看这个提示,好像是说不支持数据类型。我的item['title']里的内容是[u'\r\n Accelerated c++\u5b66\u4e60 chapter3 ----- \u7528\u6279\u636e \r\n '],这应该是unicode,我在想,我的数据库的表是定义string,会不会是编码问题?怎样改?我查看了文档,也没找到想要的信息(可能是我没看到)新手求教!

展开
收起
爱吃鱼的程序员 2020-06-02 17:23:34 633 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
    可能是你获得字符串含有非法字符的缘故。。
    #-*- encoding: utf-8 -*-
    '''
     如果是你说的字符串,则没有任何问题
    '''
    
    from sqlalchemy import create_engine
    engine = create_engine('sqlite:///:memory:', echo=True)
    
    from sqlalchemy.ext.declarative import declarative_base
    
    Base = declarative_base()
    
    from sqlalchemy import Column, Integer, String
    
    class MyBlog(Base):
        __tablename__ = 'myblog'
        id = Column(Integer, primary_key = True)
        title = Column('title', String(200))
    
    Base.metadata.create_all(engine) 
    
    title = u'\r\n Accelerated c++\u5b66\u4e60 chapter3 ----- \u7528\u6279\u636e \r\n '
    one_blog = MyBlog ( title = title )
    
    from sqlalchemy.orm import sessionmaker
    Session = sessionmaker(bind=engine)
    Session.configure(bind=engine) 
    db_session = Session() 
    
    
    db_session.add(one_blog)
    
    a = db_session.query(MyBlog).first()
    print (a.title)



    ######

    引用来自“junanhonglei”的评论

    可能是你获得字符串含有非法字符的缘故。。
    #-*- encoding: utf-8 -*-
    '''
     如果是你说的字符串,则没有任何问题
    '''
    
    from sqlalchemy import create_engine
    engine = create_engine('sqlite:///:memory:', echo=True)
    
    from sqlalchemy.ext.declarative import declarative_base
    
    Base = declarative_base()
    
    from sqlalchemy import Column, Integer, String
    
    class MyBlog(Base):
        __tablename__ = 'myblog'
        id = Column(Integer, primary_key = True)
        title = Column('title', String(200))
    
    Base.metadata.create_all(engine) 
    
    title = u'\r\n Accelerated c++\u5b66\u4e60 chapter3 ----- \u7528\u6279\u636e \r\n '
    one_blog = MyBlog ( title = title )
    
    from sqlalchemy.orm import sessionmaker
    Session = sessionmaker(bind=engine)
    Session.configure(bind=engine) 
    db_session = Session() 
    
    
    db_session.add(one_blog)
    
    a = db_session.query(MyBlog).first()
    print (a.title)



    谢谢,我解决了,是因为item['title'] = sel.xpath('//*[@class="link_title"]/a/text()').extract()
    这里得到的一个列表,而我的数据库的类型定义为string,所以需要改为
    item['title'] = sel.xpath('//*[@class="link_title"]/a/text()').extract() ,这样才把把列表中的元素传为数据库,

    ######那个笑脸是[0],不知道为什么在开源中国上,总是会显示表情
    2020-06-02 17:23:53
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Continuous Application with FAIR Scheduler 立即下载
RESOURCE AWARE SCHEDULING IN APACHE STORM 立即下载
RESOURCE AWARE SCHEDULING IN A 立即下载