1

我正在尝试将一个整数、一个字符串和一个列表作为单个记录插入到数据库中,但我遇到了一个错误。

这是我的代码:

values=nprnd.randint(10, size=48) #NUMPY ARRAY
valuelist= map(None, values); #Convert to list
guid=''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(20)) #Generate guid
for x in range(4):
    var_string = ', '.join('?' * 48)
    valuelist.insert(0,x)
    valuelist.insert(0,ent_guid)
    #50 coloums in table, guid, x and 48 randomly generated values
    query_string = 'INSERT INTO schema1 VALUES (%s,%d,%s);' % (guid, x, var_string) 
    cursor.execute(query_string, valuelist)

我不断收到错误消息:

Traceback (most recent call last):
  File "script.py", line 19, in <module>
    cursor.execute(query_string, valuelist)
  File "/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/MySQLdb/cursors.py", line 184, in execute
    query = query % db.literal(args)

我知道这个错误的原因(即使 SO 对同一个错误有几个问题),但我尝试过的解决方案都没有为我解决这个错误

任何帮助,将不胜感激

4

4 回答 4

2

我相信 MySQL-python 使用 printf 格式代码(例如“%s”)而不是“?” 占位符。尝试var_string这样设置:

    var_string = ', '.join(['%s'] * 48)

我也同意Endophage似乎valuelist太长了。我认为您不需要插入aland ent_guid

插入时还需要在 guid 周围加上引号:

    query_string = 'INSERT INTO schema1 VALUES (\'%s\',%d,%s);' % (guid, x, var_string)
于 2013-04-23T15:33:09.780 回答
1

在生成 48 '?'s 后,您将 2 个元素插入到 valuelist 中,您是否考虑过这些?以下代码将更加健壮:

values=nprnd.randint(10, size=48) #NUMPY ARRAY
valuelist= map(None, values); #Convert to list
guid=''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(20)) #Generate guid
for x in range(4):
    valuelist.insert(0,al)
    valuelist.insert(0,ent_guid)

    # moved this line and using len(valuelist)
    var_string = ', '.join('?' * len(valuelist)) 

    #50 coloums in table, guid, x and 48 randomly generated values
    query_string = 'INSERT INTO schema1 VALUES (%s,%d,%s);' % (guid, x, var_string) 
    cursor.execute(query_string, valuelist)

更新:

从您在下面的评论中,听起来您正在尝试双重插入 guid 和 x 值,因此,将 query_string 分配(以及我在上面所做的其他更改)更改为:

query_string = 'INSERT INTO schema1 VALUES (%s);' % (var_string)

这比您当前的字符串插值更安全,因为这cursor.execute将确保值被适当地转义。

于 2013-04-23T15:13:37.993 回答
0

看起来您valuelist每次通过循环时都会将大小增加 2。

valuelist.insert在现有列表的开头添加一个新项目,因此第一次通过循环,valuelist包含 50 个元素,然后是 52 个元素,下一个是 54 个元素,依此类推。

query_string虽然只包含 48 个项目的占位符,所以这会导致错误。

如果您删除这些行,并更改“?” 到'%s',你应该有更好的结果,例如:

for x in range(4):
    var_string = ', '.join('%s' * 48) 
    query_string = "INSERT INTO schema1 VALUES ('%s',%d,%s);" % (guid, x, var_string) 
    cursor.execute(query_string, valuelist)
于 2013-04-23T16:44:54.350 回答
-1

尝试在查询中用单引号将您的值括起来。

query_string = "INSERT INTO schema1 VALUES ('%s','%d','%s');" % (guid, x, var_string)
于 2013-04-23T15:04:18.097 回答