InterfaceError:(sqlte3.InterfaceError)Error binding parameter 0

applejj 发布于 2015/09/09 10:00
阅读 567
收藏 0

最近在学习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,会不会是编码问题?怎样改?我查看了文档,也没找到想要的信息(可能是我没看到)新手求教!

加载中
0
junanhonglei
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)



0
a
applejj

引用来自“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(),这样才把把列表中的元素传为数据库,

a
applejj
那个笑脸是[0],不知道为什么在开源中国上,总是会显示表情
返回顶部
顶部