在 python 中生成代码到 mariadb 的最佳调整是什么?

what the best tune for generate code in python to mariadb?

我有这个用于生成唯一代码的代码,

import mysql.connector as mariadb
import time 
import random

mariadb_connection = mariadb.connect(user='XX', password='XX', database='XX', port='3306', host='192.168.XX.XX')
cursor = mariadb_connection.cursor()

FullChar = 'CDHKPMQRVXY123456789'
total = 20
count = 7
entries = []
uq_id = 0
flg_id = None
get_id = None
bcd = None

def inputDatabase(data):
    try:
        maria_insert_query = "INSERT INTO BB_UNIQUE_CODE(unique_code, flag_code, get_id, barcode) VALUES (%s, %s, %s, %s)"
        cursor.executemany(maria_insert_query, data)
        mariadb_connection.commit()
        print("Commiting " + str(total) +  " entries..")
    except Exception:
        maria_alter_query = "ALTER TABLE PromoBigrolls.BB_UNIQUE_CODE AUTO_INCREMENT=0"
        mariadb_connection.rollback()
        print("UniqueCode Rollbacked")
        cursor.execute(maria_alter_query)
        print("UniqueCode Increment Altered")
while (0 < 1) :
    for i in range(total):
        
        unique_code = ''.join(random.sample(FullChar, count)) 
        
        entry = (unique_code, flg_id, get_id, bcd)
        entries.append(entry)
    

    inputDatabase(entries)
    #print(entries)
    entries.clear()
    time.sleep(0.1)

我的代码输出:

1 K4C1D9M null null null
2 K2R9XH3 null null null
3 5M3V9R2 null null null

这段代码是运行正确的,但是生成的唯一码达到30M后,回滚太多,因为如果数据库中有相同的唯一码,它会回滚最新的数据。有什么建议吗? 谢谢

在我看来,UUID 绝对是正确的选择。顺便说一下,您对 random.sample() 的使用相当不寻常 - 您最终可能会连续两次(或多次)生成相同的“唯一”代码。

我不知道你为什么要自定义一个 UUID,因为它本来就是一个没有意义的唯一标识符;但如果你真的需要你的 ID 是由 FullChar 中的字符组成的字符串,那么你可以生成 UUID,将其转换为索引列表,并使用它来构建你的最终字符串:

def int2code(n, codestring):
    base = len(codestring)
    numbers = []
    while n > 0:
        x = n % base
        numbers.append(x)
        n //= base
    chars = [codestring[c] for c in reversed(numbers)]
    return ''.join(chars)

unique_code = int2code(int(str(uuid.uuid1().int)), FullChar)

编辑

正如@shoaib30 所指出的,您正在生成 7 个字符的长代码。

虽然这并不难处理(最简单但可能不是最聪明的方法就是计算 uuid.uuid1().int % 20**7 并在上面的函数中使用它),但它很容易引起冲突:UUID 是一个 128 位整数,或大约 3.4+e38 个可能值,而 20 个项目中的 7 个的排列仅为 3.9+e08,或 3.9 亿。所以你有 1.0e+30 个不同的 UUID,它们将被翻译成相同的代码。