迭代在列表上,删除与数据库匹配的每个值

问题描述 投票:0回答:1

我一直在python中处理这个函数。我打算迭代一个电话号码列表,检查数据库以查看该号码是否已被使用。如果已经使用过,它应该从列表中删除电话号码并选择另一个并检查新电话号码,直到找到未使用的电话号码并返回未使用的电话号码。如果没有使用它,它应该只返回数字。但是,在一次运行之后,它会选择一个数字,检查它,运行,然后将其输入数据库。下一次运行将删除以前使用的数字,并选择另一个未使用的数字。它继续运行并将此数字输入数据库。第三次运行不会从列表中删除以前使用的数字,但无论如何它仍然会选择一个新数字。虽然这仍然有效,但是当数字用完时,由于没有其他人可以选择,它会继续使用列表中的最后一个数字来执行每个后续运行的脚本。对不起,如果代码现在有点草率,我有点匆忙,这只是我一直在搞乱的脚本。我希望这是清楚的,而不是太混乱。如果我需要清除任何困惑,我也会很高兴。

编辑:对不起,我忘了提到这些电话号码经常被另一个脚本从网站上抓取。下面列出的这些数字只是一个用于测试的虚拟集。所以最后,我需要通过检查数据库表来查看是否已使用这些最近获取的数字。

import random
import names




##############################Information Variables##################################
emailAddress = "[email protected]"
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()
python database python-3.x sqlite
1个回答
1
投票

不要这样做。使用您的电话号码填充表格,并使用“已使用”字段更新每个电话号码记录。

始终在可能的情况下在数据库中保持状态和数据建模。它是为它而制造的。

响应OP的更新:

为电话号码创建一个单独的表,并将帐户表中的号码字段替换为电话号码表主键的外键ID。这称为维护对象模型或数据模型,因此,如果要查询帐户,则可以通过外键获得所需的数据,如果只需要电话号码,则可以直接查询电话号码表。

通过这种方式,您的电话号码“对象”可以拥有自己的属性,例如“已调用”或“不在呼叫列表中”,而不会弄乱您的帐户“对象”。

如果要插入新帐户,应首先将新电话号码“对象”插入电话号码表并返回ID,然后在帐户插入中使用该帐号。

© www.soinside.com 2019 - 2024. All rights reserved.