2013-02-11 69 views
1

我在将元素插入MySQL数据库时遇到问题。当其中一个元素是Python字典时,向MySQL表中插入一行

这里是我的代码有:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

myData = [ { u'my_text' : {u'id': u'1', u'description' : u'described' }, u'my_id' : u'1' } ] 

import MySQLdb as mdb 
con = None 
con = mdb.connect('localhost', 'abc', 'def', 'ghi'); 
cur = con.cursor() 
con.set_character_set('utf8') 
cur.execute('SET NAMES utf8;') 
cur.execute('SET CHARACTER SET utf8;') 
cur.execute('SET character_set_connection=utf8;') 

sql = "INSERT IGNORE INTO MyTable ('my_id', 'my_text') VALUES (%(my_id)s, %(my_text)s);" 
cur.executemany(sql, myData) 
con.commit() 

if con: con.close() 

我的数据库与此创建:

CREATE TABLE MyTable(
    'my_id' INT(10) unsigned NOT NULL, 
    'my_text' TEXT 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

你可以从python脚本看到我的列表中的一个元素是一本字典,它似乎是这停止插入到MySQL数据库,但因为我在最近几天才开始使用MySQL,所以我可能是错的。

如果我让my_textmyData一个简单的文本短语,如下面的一切工作正常,并插入到数据库表的正常工作:

myData = [ { u'my_text' : u'something simple', u'my_id' : u'1' } ] 

我希望能够利用这样的:

myData = [ { u'my_text' : {u'id': u'1', u'description' : u'described' }, u'my_id' : u'1' } ] 

我在做什么错?

+0

您只能将文本插入到数据库文本字段中。你会期望字典看起来像表达为一个字符串?在尝试插入之前,必须将其转换为该格式。 – 2013-02-11 19:11:22

+0

我希望它会自动将字典转换为字符串。我会怎么做呢? – user1464409 2013-02-11 19:17:05

回答

1

您至少有两种选择。

  1. 更改表模式:

    CREATE TABLE MyTable(
        'my_id' INT(10) unsigned NOT NULL, 
        'id' INT(10), 
        'description' TEXT 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 
    
    
    sql = "INSERT IGNORE INTO MyTable ('my_id', 'id', 'description') VALUES (%s, %s, %s)" 
    myArg = [(dct['my_id'], dct['my_text']['id'], dct['my_text']['description']) 
         for dct in myData] 
    cur.executemany(sql, myArg) 
    
  2. 或更改传递给cur.executemany的ARG:

    myData = [ { u'my_text' : {u'id': u'1', u'description' : u'described' }, u'my_id' : u'1' } ] 
    myArg = [ {'my_txt' : str(dct['my_text']), 
          'my_id' : dct['my_id']} for dct in myData ] 
    cur.executemany(sql, myArg) 
    

改变模式表的好处是,你现在可以根据id选择,所以数据更丰富。

但是,如果你不需要从描述中分离出id,那么第二种方法将不需要改变表格模式。

相关问题