利用 python 數(shù)據(jù)庫(kù)連接,對(duì)型如:aaa&bbb&ccc 這樣的標(biāo)簽組,拆分為標(biāo)簽和bookid 對(duì)應(yīng)的多對(duì)多數(shù)據(jù)表。
# -*- 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):
# 創(chuàng)建數(shù)據(jù)庫(kù)連接方法
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 字段摘出來(lái)的表。tagtemp表中的數(shù)據(jù)有 574282條數(shù)據(jù)。
這樣,一邊查數(shù)據(jù),然后再拆分成多條記錄(最后拆出來(lái)的有2,229,934)。效率上特別慢。
應(yīng)該用多線程,用sql 的聯(lián)合插入,或者sql 的事務(wù)來(lái)加速整個(gè)過(guò)程的。