使用Python避免循环更新MySQL表中数据的最有效方法是什么?

时间:2012-08-23 18:03:20

标签: python mysql dictionary

格式化数据的最佳方法是什么?

以下是背景资料:

我正在使用nameparser以最佳方式解析名称。我构建了一个调用nameparser的包装器,然后将解析后的名称存储在数据库(MySQL)中。

在这种情况下,最有效的方法是什么?以下是我的方法。

  1. 第1步:调用nameparser(提供tablename,id,name,first, 中,后,后缀)。
  2. 第2步:将已解析(返回)的名称存储在 这种形式的记录在内存中(我正在解析相对较小的名字 设置 - 说出20,000个名字)。 {id:{'first':'John', 'middle':'V', 'last':'Doe', 'suffix':''}
  3. 第3步:将dict存储在MySQL中 一个查询表? (不确定数据是否可行 步骤2中描述的结构。
  4. 这是我的代码:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    from nameparser import HumanName
    
    import time
    
    cursor = db.cursor()
    
    
    def name(table, id, name, first, middle, last, suffix):
    
        cursor.execute('SELECT `' + id + '`,`' + name + '` FROM `' + table
                       + '` WHERE `' + name + '` IS NOT NULL AND ' + id
                       + ' IS NOT NULL')
    
        numrows = int(cursor.rowcount)
        namelist = []
        namelist = cursor.fetchall()
    
        for record in namelist:
            parsed = HumanName(record[1])
            parsed.capitalize()
            mydict[int(record[0])] = {
                'first': str(parsed.first),
                'middle': str(parsed.middle),
                'last': str(parsed.last),
                'suffix': str(parsed.suffix),
                }   
    
    mydict = {}
    
    starttime = time.time()
    
    split = name('NamesToParse','id','name','first','middle','last','suffix')
    print mydict
    print time.time() - starttime
    

    请建议将数据存储在MySQL表中的最佳方法。这是我到目前为止所做的,我仍然需要遍历每条记录。我想知道是否有办法update现有的表,而不是先创建一个临时表,然后一次更新原始表?希望我有道理。

    for id, val in mydict.items():
    
        sorted_keys = sorted(map(str, val.keys()))
        sorted_vals = map(encoding, [val[mydict] for mydict in sorted_keys])  # sorted by keys
        formatted = ', '.join(["'%s'"] * len(sorted_vals))
        db.execute("""insert into NamesToParseOut(%s) values (%s)""" % (', '.join(sorted_keys), formatted), sorted_vals)
    

1 个答案:

答案 0 :(得分:0)

看起来我将采用元组列表方法并首先插入临时表,然后使用原始表更新它们。节省的时间是惊人的。我觉得字典对于这项任务来说太过分了。

mylistoftuples.append((int(record[0]), str(parsed.first),str(parsed.middle),str(parsed.last),str(parsed.suffix)))

cursor.executemany("""insert into NamesToParseOut(id, first, middle, last, suffix) values (%s, %s, %s, %s, %s)""", mylistoftuples)