Python sqlite3'executemany'无法成功更新我的数据库

时间:2016-09-16 21:53:33

标签: python sqlite sql-update executemany

我正在尝试从数据库中提取列,应用转换,并使用结果创建新列。

我最终想要将局部变量'new_proba'(长度为740,与我的数据库长度相同)保存为名为'predict_proba_tplus1'的新列。从阅读this thread开始,我了解到UPDATE函数需要一个元组。

我创建了一个'IDs'列表,它与数据库中的indexID列匹配,然后用'new_proba'压缩它以创建输出'(0.56298709097028454,0),(0.54392926856501334,1)等的元组。

下面的函数实际上并没有抛出任何错误,但它只创建了列'predict_proba_tplus1'并且没有填写我期望c.executemany()做的任何值 - 我留下了一个新列填充NULL值。这让我觉得WHERE语句出了问题 - 即由于某些原因它没有将indexID列与IDs变量匹配,尽管数字相同。

任何见解都会非常感激。

def update_class_proba(path):
    conn = sqlite3.connect(path)
    c = conn.cursor()
    cursor = c.execute('SELECT text, indexID FROM reuters_test_X')
    all_rows = cursor.fetchall()
    X = vect.transform(x[0] for x in all_rows)
    new_proba = list(clf.predict_proba(X)[:,1])
    IDs = list(np.arange(0, 740, 1))
    new_proba_tuple = list(zip(new_proba,IDs))
    c.execute('ALTER TABLE reuters_test_X ADD COLUMN predict_proba_tplus1 REAL')
    c.executemany('UPDATE reuters_test_X SET predict_proba_tplus1=? WHERE indexID=?', new_proba_tuple)
    conn.commit()
    conn.close()

1 个答案:

答案 0 :(得分:0)

这些值不是float;它们是numpy.float64,数据库无法处理。

将您的值转换为普通floatint,如下所示:

new_proba = list(float(z) for z in clf.predict_proba(X)[:,1])
IDs = list(int(zz) for zz in np.arange(0, 740, 1))