今天领导要求数据库中插入1W条数据,研究了一下,下面是实现代码:
可使用两种方式进行下载安装:
1、使用pip方式下载安装
pip install pymysql
2、IDE方式
安装完成后就可以正常导入模块使用。
根据需要,创建一个数据库及表,表里放入fid, fdate, fproduct_id, fcost_time, fstatus, flog_content, fbus_type, fbus_name, fpmoney,fomoney,下面,直接上代码:
import pymysql
import random
import time
from datetime import datetime
fstatus_list = ['0', '1']
content_list = ['数据异常', '对账成功',
'对账失败:ACS-109050P资产对账时出错!:DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=uatacs.T_DI_CF_CUSFUND, DRIVER=3.58.82',
'对账失败:AMS-109051P资产对账时出错!:DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=uatacs.T_DI_CF_CUSFUND, DRIVER=3.58.82',
'对账失败:ACS-204050P资产对账时出错!:DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=uatacs.T_DI_CF_CUSFUND, DRIVER=3.58.82']
type_dict = {'YHCK': '银行存款对账', 'YQDZ_BZJ': '银期对账_保证金', 'YQDZ_BFJ': '银期对账_备付金', 'CCDZ': '持仓对账'}
fid_start = 16122016170315051473
fproduct_id_list = ['01','02','03','04','05','06','07','08']
class Sqldriver(object):
# 初始化属性
def __init__(self):
self.host = 'hostIP'
self.port = 3306
self.user = 'root'
self.password = 'root'
self.database = 'bi_acs'
# 连接数据库
def Connect(self):
self.db = pymysql.connect(
host=self.host,
port=self.port,
user=self.user,
password=self.password,
database=self.database,
charset='utf8'
)
# 插入数据
def insert(self, fid, fdate, fproduct_id, fcost_time, fstatus, flog_content, fbus_type, fbus_name, fpmoney, fomoney):
try:
# 连接数据库
self.Connect()
# 创建游标
global cursor
cursor = self.db.cursor()
# sql命令
sql = "insert into t_dc_result(fid,fdate,fproduct_id,fcost_time,fstatus,flog_content,fbus_type,fbus_name,fpmoney,fomoney)" \
" values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
# 执行sql语句
cursor.execute(sql, (
fid, fdate, fproduct_id, fcost_time, fstatus, flog_content, fbus_type, fbus_name, fpmoney, fomoney))
except Exception as e:
print(e)
finally:
cursor.close()
self.db.commit()
self.db.close()
# 生成随机日期
def mkdate(self):
a1 = (2016, 1, 1, 0, 0, 0, 0, 0, 0)
a2 = (2019, 12, 31, 23, 59, 59, 0, 0, 0)
start = time.mktime(a1)
end = time.mktime(a2)
for i in range(10):
t = random.randint(start, end)
date_touple = time.localtime(t)
date = time.strftime("%Y-%m-%d", date_touple)
print(type(date))
return date
# 数据生成并调用数据插入方法
def data_make(self):
fid = fid_start
fdate = self.mkdate()
fproduct_id = random.choice(fproduct_id_list)
fcost_time = str(round(random.uniform(1, 100), 2))
fstatus = random.choice(fstatus_list)
flog_content = random.choice(content_list)
fbus_type = random.choice(list(type_dict.keys()))
fbus_name = str(type_dict[fbus_type])
fpmoney = str(random.randint(10000, 99999999))
fomoney = str(random.randint(10000, 99999999))
self.insert(fid, fdate, fproduct_id, fcost_time, fstatus, flog_content, fbus_type, fbus_name, fpmoney, fomoney)
fid = fid + 1
if __name__ == '__main__':
db = Sqldriver()
# for循环
for record in range(1,10001):
db.data_make()
fid_start +=1
通过脚本执行,数据库中成功生成1W条数据,并且fid实现自增长。
注:实现过程中,出现一个报错,困扰好久,最后查阅资料得以解决,一起分享一下。
参数字符串格式化时,字符串格式化不是标准的python的字符串格式化,应当一直使用%s用于字符串格式化,所有的字符类型都需要改成%s插入数据库,另外,port是一个number类型,而不是str类型,所以定义port的时候,不需要引号,这样问题就得到解决。
网上大多方法都只关注SQL语句中是否全部替换为%s,而忽略了port的字符类型而报错迟迟没有得到解决,两个地方都需要注意。