grpidx_data=[]
for i in range(0,len(data1)):
grpidx_data.append((data1.loc[i,'price'],data1.loc[i,'id']))
cur.executemany("insert into grpidx values (%s,%s)",grpidx_data)
我使用python3.3和pymssql。我想将数据从python导入MSSQL。 grpidx_data的类型是列表(元组),如[(12,1),(34,2),...],我运行上面的代码然后得到错误:
ValueError:期望一个简单的类型,一个元组或一个列表
如果我只使用类型为列表(元组)的数据,则代码可以正常工作。但是当我使用for循环获取数据时,即使它的类型也 list(元组),它也无法正常工作。
那么如何解决这个问题呢?
谢谢!
答案 0 :(得分:4)
我遇到了同样的问题,实际上有一个运行的脚本和一个没有运行的脚本。我最终发现,正在工作的是所有字符串而另一个有数字。进一步挖掘我发现坏的类型是numpy用于整数的 numpy.int64 类型。看起来你正在使用pandas,它也有这些数字类型。我把它强制成一个字符串,再次运行代码,一切正常。
我写了一个特殊的清理函数来清理元组,然后再运行它:
def tupleGetter(x):
for i in range(len(x)):
if str(type(x[i])) == "<class 'numpy.int64'>":
x[i] = str(x[i])
return tuple(x)
然后我运行了我的代码,几乎与上面的内容完全相同:
myValues = (tupleGetter(df.ix[i]) for i in range(len(df)))
cursor.executemany("""INSERT INTO dbo.MyTable([A],[B],[C],[C],[D],[E],[F])
VALUES (%s, %s, %s, %s, %s, %s)""",
myValues
)
conn.commit()
没问题。
一定要dropna()
,因为这也是一种奇怪的类型。
答案 1 :(得分:2)
正如billmanH所指出的那样,使用pymssql不期望的类型会产生这个错误。
当你想在数据库中存储字符串但是我想要数字时,转换为字符串是有效的。 通过将所有字符串作为字符串并在SQL端进行转换,我可以完全控制 数据的类型。
cursor.execute("INSERT INTO my_table(my_int_column, my_numeric_column) VALUES (CAST(%s AS INTEGER), CAST(%s AS NUMERIC(19, 9)))",
my_tuple_containing_strings)