Python 使用SQL Alchemy添加到数据库时出现奇怪的类型错误
我刚刚开始使用SQLAlchemy包for python来维护一个简单的sqlite3数据库,以便进行一些实验。这个bug花了我一段时间才弄明白,所以我想我应该把它贴上去。对于我发现的方法,可能还有更好的方法。我正在使用Python 2.7.2 当我在一个类中有一个整数列与数据库中的一个表相匹配时,问题就出现了,比如这个简单的Featdata类Python 使用SQL Alchemy添加到数据库时出现奇怪的类型错误,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我刚刚开始使用SQLAlchemy包for python来维护一个简单的sqlite3数据库,以便进行一些实验。这个bug花了我一段时间才弄明白,所以我想我应该把它贴上去。对于我发现的方法,可能还有更好的方法。我正在使用Python 2.7.2 当我在一个类中有一个整数列与数据库中的一个表相匹配时,问题就出现了,比如这个简单的Featdata类 class FeatData(Base): __tablename__ = 'featdata' id = Column(Integer, p
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:14376信息sqlalchemy.engine.base.engine BEGIN(隐式)
2014-03-28 06:50:14377信息sqlalchemy.engine.base.engine插入featdata(名称、值、“顺序”)值(?,,?)
2014-03-28 06:50:14377信息sqlalchemy.engine.base.engine('widget',2,1)
2014-03-28 06:50:14378信息sqlalchemy.engine.base.engine回滚
文件“/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行,在dou execute中
cursor.execute(statement, parameters)
sqlalchemy.exc.InterfaceError:(InterfaceError)绑定参数2时出错-可能是不支持的类型。u'插入featdata(名称、值、“顺序”)值(?,?)'('widget',2,1)
numpy方法返回的类型不是整数类型: 我在我的解释器上尝试了下面的代码
>>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)) ]
我知道这一点,但在看到misspec的回答之前我就知道了,所以我还是发布了我自己的答案。当使用SQLAlchemy在sqlite3数据库中创建
列(整数)
时,需要为该列插入python int值。在我的例子中,我正在使用numpy做一些事情,它返回一个int数组,我用它来填充列。但是在这种情况下,i
是
而不是
它需要的样子
解决此问题而不做任何更改的简单方法是将numpy int包装在int()
中:
我的回答解决了你的问题吗?
for i in numpy.argsort(featvalues):
newobjects += [FeatData(name=featnames[int(i)], value=featvalues[i], order = i) ]