我一直在使用python中的这个函数。我打算迭代一个电话号码列表,检查数据库以查看该号码是否已被使用。如果已经使用过,它应该从列表中删除电话号码并选择另一个并检查新电话号码,直到找到未使用的电话号码并返回未使用的电话号码。如果没有使用它,它应该只返回数字。但是,在一次运行之后,它会选择一个数字,检查它,运行,然后将其输入数据库。下一次运行将删除以前使用的数字,并选择另一个未使用的数字。它继续运行并将此数字输入数据库。第三次运行不会从列表中删除以前使用的数字,但无论如何它仍然会选择一个新数字。虽然这仍然有效,但是当数字用完时,由于没有其他人可以选择,它会继续使用列表中的最后一个数字来执行每个后续运行的脚本。对不起,如果代码现在有点草率,我有点匆忙,这只是我一直在搞乱的脚本。我希望这是清楚的,而不是太混乱。如果我需要清除任何困惑,我也会很高兴。
编辑:对不起,我忘了提到这些电话号码经常被另一个脚本从网站上抓取。下面列出的这些数字只是一个用于测试的虚拟集。所以最后,我需要通过检查数据库表来查看是否已使用这些最近获取的数字。
import random
import names
##############################Information Variables##################################
emailAddress = "Fakeemail@mail.com"
titleValues = [0,1] #0 is 'Mr.', 1 is 'Mrs.'
country = 'Schwifty'
title = random.choice(titleValues)
#Generate a random name based on gender
if title == 1:
firstName = names.get_first_name(gender= 'female')
else:
firstName = names.get_first_name(gender= 'male')
lastName = names.get_last_name()
fullName = firstName + ' ' + lastName
print(fullName)
phoneNumber = '111-222-3333'
#########################################################
import sqlite3
import time
import datetime
conn = sqlite3.connect('accounts.db')
c = conn.cursor()
def createTable():
c.execute('CREATE TABLE IF NOT EXISTS accounts(Email TEXT, Name TEXT, Title TEXT, PhoneNumber TEXT, Country TEXT, DateStamp TEXT)')
def dynamic_data_entry(email, name, title, phone, country):
unix = time.time()
date = str(datetime.datetime.fromtimestamp (unix).strftime('%Y-%m-%d %H:%M:%S'))
c.execute('INSERT INTO accounts (Email, Name, Title, PhoneNumber, Country, DateStamp) VALUES (?, ?, ?, ?, ?, ?)', (email, name, title, phone, country, date))
conn.commit()
createTable()
#################################TEST NUMBER CHECK###########################
phoneNumbers = ['111-222-3333', '444-555-6666', '777-888-9999', '123-456-7890', '321-321-321']
def checkNumber(a):
c.execute("SELECT * FROM accounts WHERE PhoneNumber = ?", (a,))
row = c.fetchall()
if row:
print("Phone number has already been used, choosing another and deleting current from list.")
phoneNumbers.remove(a)
a = random.choice(phoneNumbers)
checkNumber(a)
elif row == False:
print("Number is fresh and new, using " + a)
return a
elif row == None:
print('No new phone numbers to use, exiting... ')
exit()
# for num in phoneNumbers:
# checkNumber(num)
# print(num)
checkNumber(phoneNumber)
print(phoneNumbers)
print('working')
##########################################
# INSERT DATA TO DB #
##########################################
#Insert information to database in this order: email, name, title, phone, country
dynamic_data_entry(emailAddress, fullName, title, phoneNumber, country)
conn.commit()
c.close()
conn.close()
答案 0 :(得分:1)
不要这样做。使用您的电话号码填充表格,并使用“使用过的”字段更新每个电话号码记录。
始终在可能的情况下将状态和数据建模保留在数据库中。它是为它而制造的。
响应OP的更新:
为电话号码创建一个单独的表格,并将帐户表格中的号码字段替换为电话号码表主键的外键ID。这称为维护对象模型或数据模型,因此,如果要查询帐户,您可以通过外键获得所需的数据,如果只需要电话号码,则可以直接查询电话号码表。
通过这种方式,您的电话号码“对象”可以拥有自己的属性,例如“已经呼叫”或“在不通话列表中”,而不会弄乱您的帐户“对象”。
如果您想插入新帐户,首先应将新的电话号码“对象”插入电话号码表并返回ID,然后在帐户插入中使用该帐号。