python 批量生成唯一优惠券码(供php调用)
admin
2023-07-31 01:45:04
0

python 批量生成优惠券码并写入数据表

说明:这篇文章主要讲的是个人工作中遇到的解决问题的方法,而非程序写的多优美。要完善的地方太多了,大家嘴下留情

why do this

为什么要这么做?优惠券码直接在用的时候用程序直接生成不就OK了吗?

好,那么问题来了,我们的系统需要一次性发送几十万张优惠券,怎么破。这里引来这个问题(php编写的web程序)

1.通过php函数来生成几十万个优惠券码,然后分批次比如每次1000插入到数据表中,主要考虑到这几十万的码会占用大量内存,而且php执行时间也会过长,虽然可以设置超时时间,但总归不是better的解决方案

2.现有各个系统中都存在自己优惠券码的生成规则,但是数据表却是同一张,有了这个优惠码池,各个系统就无需再自己生成优惠码,而是直接要用多少读取多少即可。

引申出优惠券码池表(保证code值唯一)

数据表结构

CREATE TABLE `prefix_coupon_pool` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'自增ID\',
  `code` varchar(32) NOT NULL COMMENT \'优惠券码 唯一性约束\',
  `is_assigned` tinyint(1) DEFAULT \'0\' COMMENT \'0:未分配 1:已分配\',
  `created_at` int(10) unsigned DEFAULT \'0\' COMMENT \'生成时间\',
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_code` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

python 代码说明

1.安装python-dotenv用来获取.env配置

git:https://github.com/theskumar/python-dotenv

2.建立.env文件

  DB_HOST=localhost
  DB_DATABASE=test
  DB_USERNAME=root
  DB_PASSWORD=root
  DB_PORT=3306

调用方法 ./pymakecoupon.py pp 6 10000

pp:优惠券前缀

6:优惠券长度

10000:生成个数

python源码如下

#!/usr/bin/env python
#coding:utf-8

import random
import string
from os.path import join, dirname
from dotenv import load_dotenv
from mysql import connector
import mysql
import os
import time
import sys


originCode = string.ascii_lowercase
failedRecord = 0

def getConnection():
    dotenv_path = join(dirname(__file__), \'.env\')
    print dotenv_path
    load_dotenv(dotenv_path)
    host = os.environ.get(\'DB_HOST\')
    user = os.environ.get(\'DB_USERNAME\')
    password = os.environ.get(\'DB_PASSWORD\')
    database = os.environ.get(\'DB_DATABASE\')
    port = os.environ.get(\'DB_PORT\')
    try:
        connect = connector.connect(host=host, user=user, password=password, database=database, port=port)
        return connect
    except mysql.connector.Error as e:
        print e
        return False
    except Exception as e:
        return False

def makeCouponCode(prefix=\'p\', length = 6):
    str = prefix
    if length == 0:
        pass
    for index in range(length):
        str += random.choice(originCode)
    return str

if __name__ == \'__main__\':
    args = sys.argv
    codeList = []
    if len(args) != 4:
        print \'参数错误,调用方式为:./pymakecoupon.py p10 6 100\'
        exit()
    try:
        prefix = args[1]
        length = int(args[2])
        count = int(args[3])
    except IndexError as e:
        print \'参数错误\'

    msg = \'将生成前缀为:%s,优惠券长度为:%s,总共%s个优惠券码\'
    msg = msg % (prefix, length, count)
    print msg
    inputPrompt = raw_input(\'y/n\\n\')
    if inputPrompt == \'y\':
        pass
    else:
        print \'bye\'
        exit

    connect = getConnection()
    if connect == False:
        sys.exit(0)
    cursor = connect.cursor()
    codeString = \'\'
    now = int(time.time())
    for index in range(1,count+1):
        pass
        code = makeCouponCode(prefix,length)
        codeTemplate = \'(\\\'%s\\\',%s)\'
        code = codeTemplate % (code,now)
        codeList.append(code)
        print code
        if index % 1000 == 0:
            codeString = \",\".join(codeList)
            sql = \'INSERT IGNORE INTO prefix_coupon_pool(code,created_at)VALUES %s\'
            sql = sql % (codeString)
            cursor.execute(sql)
            connect.commit()
    connect.close



相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...