我刚开始使用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)
答案 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) ]