【问题标题】:pymssql: executemany value error - expected a simple type, a tuple or a listpymssql: executemany value error - 期望一个简单类型、一个元组或一个列表
【发布时间】:2016-11-09 09:16:21
【问题描述】:
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 的类型是 list(tuple),like[(12,1),(34,2),...],我运行上面的代码然后报错:

ValueError: 期望一个简单类型,一个元组或一个列表

如果我只使用类型为 list(tuple) 的数据,则代码可以正常工作。但是当我使用 for 循环获取数据时,即使它的类型也是 list(tuple),它不起作用。

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

谢谢!

【问题讨论】:

  • 你能print(grpidx_data)看看它的内容吗?
  • print(grpidx_data) [(40273730, 1.0), (50685730, 1.0), (52084730, 1.0), ...(36399702, 24.0)]
  • 你试过用%d 代替%s : cur.executemany("insert into grpidx values (%d,%d)",grpidx_data) 吗?
  • 我试过了,还是一样的错误
  • 这个呢:cur.executemany("insert into grpidx values (%s,%s)", *grpidx_data)(注意grpidx_data前面的解包星号)

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


【解决方案1】:

我遇到了同样的问题,实际上有一个脚本运行了,一个没有运行。我最终发现起作用的是所有字符串,而另一个是数字。进一步挖掘,我发现坏类型是 numpy 用于整数的 numpy.int64 类型。看起来你正在使用熊猫,它也有这些数字类型。我将其强制为字符串,再次运行代码,一切正常。

我写了一个特殊的清理函数在运行之前清理元组:

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(),因为那也是一种奇怪的类型。

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 这是一个很好的方法,但是我发现如果数据库需要数值,它会将字符串值强制转换为正确的数字(与日期和其他内容相同)。但是,如果您想确保事情正确投射,这将是一个很好的 QA。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多