Python批量插入数据到数据库

今天领导要求数据库中插入1W条数据,研究了一下,下面是实现代码:

1、使用pycharm安装pymsql模块

可使用两种方式进行下载安装:
1、使用pip方式下载安装
pip install pymysql
2、IDE方式
在这里插入图片描述
安装完成后就可以正常导入模块使用。

2、上代码

根据需要,创建一个数据库及表,表里放入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实现自增长。
注:实现过程中,出现一个报错,困扰好久,最后查阅资料得以解决,一起分享一下。

“TypeError: d format: a number is required, not str”

参数字符串格式化时,字符串格式化不是标准的python的字符串格式化,应当一直使用%s用于字符串格式化,所有的字符类型都需要改成%s插入数据库,另外,port是一个number类型,而不是str类型,所以定义port的时候,不需要引号,这样问题就得到解决。
网上大多方法都只关注SQL语句中是否全部替换为%s,而忽略了port的字符类型而报错迟迟没有得到解决,两个地方都需要注意。
在这里插入图片描述

  • 5
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值