1

我在将元素插入 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' } ]

我究竟做错了什么?

4

1 回答 1

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

    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 与描述分开,那么第二种方法将起作用,而无需更改表模式。

于 2013-02-11T19:18:03.727 回答