我正在尝试将一个整数,一个字符串和一个列表作为单个记录插入到数据库中,但是我发现了一个错误。
这是我的代码:
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对同一个错误也有一些问题),但我尝试过的解决方案都没有为我解决这个错误
任何帮助将不胜感激
答案 0 :(得分:2)
我相信MySQL-python使用printf格式代码(例如'%s')代替'?'对于占位符。尝试像这样设置var_string
:
var_string = ', '.join(['%s'] * 48)
我同意Endophage valuelist
似乎太长了。我认为您不需要插入al
和ent_guid
。
插入guid时,还需要在guid周围加上引号:
query_string = 'INSERT INTO schema1 VALUES (\'%s\',%d,%s);' % (guid, x, var_string)
答案 1 :(得分:1)
生成48'后,您将2个元素添加到评估者中,是否考虑过这些元素?以下代码将更加健壮:
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
将确保适当地转义值。
答案 2 :(得分: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)
答案 3 :(得分:-1)
尝试在查询中用单引号括起您的值。
query_string = "INSERT INTO schema1 VALUES ('%s','%d','%s');" % (guid, x, var_string)