在 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,它们将被翻译成相同的代码。
我有这个用于生成唯一代码的代码,
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,它们将被翻译成相同的代码。