pymssql:executemany value error - 期望一个简单的类型,一个元组或一个列表

时间:2016-07-07 06:39:00

标签: python list sql-server-2008 tuples pymssql

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(元组),它也无法正常工作。

那么如何解决这个问题呢?

谢谢!

2 个答案:

答案 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)