2013-04-23 60 views
1

我试图将一个整数,一个字符串和一个列表作为单个记录插入到数据库中,但是正在引发错误。TypeError:在使用参数插入时,并非所有在字符串格式化过程中转换的参数

这里是我的代码:

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) 

我知道这个错误的原因(即使如此,对相同的错误了几个问题)但没有我尝试了解决方案已经解决了这个错误,我

任何帮助,将不胜感激

+0

如果你需要生成一个GUID,你应该真的使用UUID模块......它就是为了这个目的。我建议'从uuid导入uuid4; guid = uuid4()。hex' – Endophage 2013-04-23 15:10:23

+0

与我目前的问题无关,但感谢您的提示! :) – navinpai 2013-04-23 15:11:21

+0

@navinpal确实是这样,但看到我的答案为可能的解决方案:-) – Endophage 2013-04-23 15:14:15

回答

2

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

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

我也Endophage同意valuelist显得太长。我不认为你需要插入alent_guid

你也需要把周围的GUID报价,当你插入:

query_string = 'INSERT INTO schema1 VALUES (\'%s\',%d,%s);' % (guid, x, var_string) 
+0

试过这..它给了我:TypeError:%d格式:需要一个数字,而不是str – navinpai 2013-04-23 15:36:09

+0

你试过了吗它没有'valuelist.insert()'行? – 2013-04-23 15:37:24

+0

是....在删除插入行后试过了吧 – navinpai 2013-04-23 15:41:09

-1

在查询中尝试围绕单引号中的值。

query_string = "INSERT INTO schema1 VALUES ('%s','%d','%s');" % (guid, x, var_string) 
+0

试过...仍然是相同的错误! :( – navinpai 2013-04-23 15:09:16

1

在生成48'?s后,您将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将确保值被适当地逃脱安全。

+0

试过,以及....它给了我同样的错误,因此尝试分配guid和x分开。在这种情况下,它会生成(guid,x,?[50]),但我们需要(guid, x,?[48])....整个表有50个颜色,一个guid(字符串),一个x(int)和48个其他颜色(再次,所有整数)。 – navinpai 2013-04-23 15:23:54

+0

@navinpai请参阅更新 – Endophage 2013-04-23 15:40:35

+0

这会导致TypeError:格式字符串没有足够的参数...因为我们只传递var_string,但需要填写%s,%d,%s的空格 – navinpai 2013-04-23 15:44:46

0

它看起来像你的2每次都要经过循环时间增加valuelist大小。

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) 
相关问题