最近工作需要向数据库中插入10条用户数据。由于用户信息部分的数据在mysql中存储的格式是blob,之前没有往数据库中插入过类似这个字段,在此记录下该问题的处理过程:
1、通过数据库插入,由于不会插入blob类型的字段,故放弃;
2、想通过用jmeter设置多个线程调用接口往数据库中插入,但是再实际执行过程中,当数据插入到2万条左右时,平均每个请求的响应时间要超过60s,速度太慢不能接受,故放弃;
3、想使用SQLAlchemy解决blob字段的插入,由于之前没有用过这个框架所以放弃;
4、通过查询发现mysql 中存储的blob字段的类型是二进制,因此想到把字符串转换为二进制的方式:string.encode(‘utf-8’) 来解决mysql blob类型字段的写入问题,尝试后成功。脚本如下,少量数据写入到数据库的性能尚可。特此记录一下,因为东西忘记的是在太快啦!!!!
import time
import uuid
from pymysql import *
def add_ke_users():
"""
235.457 s 插入100002条数据
1012.42 s 插入100002条数据
:return:
"""
myvalues = []
# 生成10万个数据
for i in range(10, 100011):
usname = "test" + str(i)
# 生成uuid
uid = uuid.uuid1()
# print(uid)
# print(type(uid))
# 获取时间戳到毫秒级
ts = int("%d" % (time.time() * 1000))
key = "/_global/user/{}".format(usname)
blob = """{"username": "%s",
"password": "$2a$10$w0kcvHED71OIJSxujraV3ekWWRc3m.v0dBdpivx5j8e0rEbceP78e",
"authorities": [{"authority": "ALL_USERS"}],
"disabled": false,
"defaultPassword": false,
"locked": false,
"uuid": "%s",
"last_modified": 0,
"create_time": %d,
"version": "4.0.0.0",
"locked_time": 0,
"wrong_time": 0,
"first_login_failed_time": 0
}""" % (usname, uid, ts)
# 将字符串转换为byte 对应mysql blob类型的字段
content = blob.encode('utf-8')
# print(content)
# 插入到数据库的数据的格式:元组
value = (key, content, ts, "0")
myvalues.append(value)
print(len(myvalues))
conn = connect(host='ip', port=3306, user='root', password='', database='database', charset='utf8mb4')
cs = conn.cursor()
# 批量添加
query = "insert into kylin.ke_lnfmt_test1 (META_TABLE_KEY, META_TABLE_CONTENT, META_TABLE_TS,META_TABLE_MVCC) values (%s, %s,%s,%s)"
cs.executemany(query, myvalues)
conn.commit()
cs.close()
conn.close()
print('OK')
if __name__ == '__main__':
add_ke_users()