利用 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 的事务来加速整个过程的。