Python操作数据库格式化数据

2017-11-14  本文已影响13人  曹波波

利用 python 数据库连接,对型如:aaa&bbb&ccc 这样的标签组,拆分为标签和bookid 对应的多对多数据表。

# -*- coding:utf-8 -*-
import mysql.connector
import gc
import sys

default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
    reload(sys)

sys.setdefaultencoding(default_encoding)


def cb_conncet_sql(sql_query):
    # 创建数据库连接方法
    config = {'host': 'localhost',
              'user': 'root',
              'password': 'root',
              'port': 3306,
              'database': 'doubanbook',
              'charset': 'utf8',
              'buffered': True
              }
    cnn = mysql.connector.connect(**config)
    try:
        cursor = cnn.cursor()
        cursor.execute(sql_query)
        cnn.commit()
        cds = cursor.fetchall()
        # print ('查询成功:' + str(cds))
        return cds
    except mysql.connector.Error as e:
        if format(e) != 'No result set to fetch from.':
            print sql_query
            print('connect fails!{}'.format(e))
    finally:
        cursor.close()
        cnn.close()
        gc.collect()


if __name__ == '__main__':
    sql_query = "SELECT * FROM doubanbook.tagtemp;"
    result = cb_conncet_sql(sql_query)
    counts = 0
    for row in result:
        bookid = row[1]
        tags = row[2].split('&')
        for tag in tags:
            sql_install = "INSERT INTO doubanbook.tags (`bookid`,`tagname`) " \
                          "VALUES ("+"'"+bookid+"'"+","+"'"+tag+"'"+");"
            # print sql_install
            counts += 1
            cb_conncet_sql(sql_install)
            # break
    print counts

反思:

tagtemp 这张表是从 books 表中的 id 字段和 tags 字段摘出来的表。tagtemp表中的数据有 574282条数据。

这样,一边查数据,然后再拆分成多条记录(最后拆出来的有2,229,934)。效率上特别慢。

应该用多线程,用sql 的联合插入,或者sql 的事务来加速整个过程的。

上一篇 下一篇

猜你喜欢

热点阅读