使用SQL Alchemy添加到数据库时出现奇怪的类型错误

时间:2014-03-29 17:57:05

标签: python sqlite sqlalchemy

我刚开始使用python的SQLAlchemy包来维护一个简单的sqlite3数据库进行一些实验。这个错误花了我一段时间才弄清楚所以我以为我会发布它。对我发现的方法可能有更好的方法。我正在使用Python 2.7.2。

当我在与数据库中的表匹配的类中有一个Integer列时会出现问题,例如这个简单的Featdata类。

class FeatData(Base):
  __tablename__ = 'featdata'

  id = Column(Integer, primary_key=True)
  name = Column(String)
  value = Column(Integer)
  order = Column(Integer)

当我尝试向表中添加记录时,我正在对数据进行一些其他操作,而不是这里显示的内容,但此代码会生成相同的错误。我首先对条目进行排序,然后使用该排序的输出来填充列值。

engine = create_engine('sqlite:///:memory:', echo=True)
Base.metadata.create_all(engine)

Session = sessionmaker(autoflush=False, bind=engine)
session = Session()

featnames=['thing','widget','dongle']
featvalues=[87,2,15]
newobjects=[]

for i in numpy.argsort(featvalues):
  newobjects += [FeatData(name=featnames[i], value=featvalues[i], order = i) ]

session.add_all(newobjects)
session.commit()

我收到以下错误消息,这里的类型有问题。有什么想法吗?

错误讯息:

  

2014-03-28 06:50:14,376 INFO sqlalchemy.engine.base.Engine BEGIN(隐含)

     

2014-03-28 06:50:14,377 INFO sqlalchemy.engine.base.Engine INSERT INTO featdata(名称,值,“订单”)VALUES(?,?,?)

     

2014-03-28 06:50:14,377 INFO sqlalchemy.engine.base.Engine('widget',2,1)

     

2014-03-28 06:50:14,378 INFO sqlalchemy.engine.base.Engine ROLLBACK

     

...

     

文件“/Library/Frameworks/Python.framework/Versions/7.2/lib/python2.7/site-packages/SQLAlchemy-0.9.3-py2.7-macosx-10.5-i386.egg/sqlalchemy/engine/ default.py“,第425行,在do_execute

cursor.execute(statement, parameters)
     

sqlalchemy.exc.InterfaceError:(InterfaceError)错误绑定参数2 - 可能不支持的类型。 u'INSERT INTO featdata(名称,值,“顺序”)VALUES(?,?,?)'('widget',2,1)

2 个答案:

答案 0 :(得分:1)

numpy方法返回的类型不是Integer类型:

我在我的翻译中尝试了以下代码

>>import numpy 
>>values = [87, 2, 15]
>>n = numpy.argsort(values) 
>>type(n[0])
numpy.int64

数据类型为numpy.int64。

在制作对象之前,尝试将类型转换为整数。

newobjects += [FeatData(name=featnames[int(i)], value=featvalues[int(i)], order = int(i)) ]

答案 1 :(得分:1)

在我看到misspec的回复之前,我想到了这一点,所以我还是发布了自己的答案。使用SQLAlchemy在sqlite3数据库中创建Column(Integer)时,您需要为该列插入值为python int的值。在我的情况下,我正在使用numpy做一些事情,返回了我用来填充列的一组int。但在这种情况下,i <type numpy.int32>不是<type 'int'>,因为它需要。

在不更改任何内容的情况下修复此问题的简单方法是将{numpy int包装在int()中:

for i in numpy.argsort(featvalues):
  newobjects += [FeatData(name=featnames[int(i)], value=featvalues[i], order = i) ]