将电子表格中的列与SQL表中的列进行比较

时间:2018-03-12 23:15:43

标签: python python-2.7

Python新手在这里。我正在尝试编写一个小的Python脚本来自动执行我经常做的一些工作。我有一个Excel电子表格,其工作表名为" new_it_users"使用A列中的用户名列表,我有一个带有" ituserlist"的SQL数据库。 table有一个名为" username"。

的列

基本上我想在Python中加载电子表格,然后根据SQL查询的结果检查A列中的每个用户名。如果有结果(即数据库表中存在电子表格的用户名,脚本将在电子表格的第6列中放置"现有用户找到"如果没有结果"没有用户找到"进入。

以下是我的一些代码。数据库连接正在运行,电子表格正在加载,但是"比较"脚本的一部分(这是其中的一部分)不起作用:(。即使我在测试期间将现有用户名添加到电子表格中,我也会在第6列中找到"没有用户找到#34;

有人能给我一些关于我做错的指导吗?非常感谢任何提示!

conn = psycopg2.connect(conn_string)

cursor = conn.cursor()

wb = openpyxl.load_workbook(input_filename)
sheet = wb.get_sheet_by_name('new_it_users')

query_statement = 'select username from ituserlist'
cursor.execute(query_statement)
sql_data = list(cursor.fetchall())

for rowNum, row in tqdm(enumerate(sheet.iter_rows(), start=1)):
    it_user = sheet.cell(row=rowNum, column=1).value

    if it_user in sql_data:
        sheet.cell(row=rowNum, column=6).value = "Existing User Found"
    else:
        sheet.cell(row=rowNum, column=6).value = "No User Found"

wb.save(output_filename)

cursor.close()
conn.close()

2 个答案:

答案 0 :(得分:1)

问题是cursor.fetchall()返回包含查询结果的元组,而不是代码假定的单个字符串。对代码的简单修复就是将查询结果按到字符串列表中。您可以使用列表推导从每行的第一项中提取用户名:

query_statement = 'select username from ituserlist'
names = [row[0] for row in cursor.execute(query_statement)]

names将包含用户名字符串列表,in比较现在应该根据需要与电子表格中的用户名匹配。

答案 1 :(得分:0)

就个人而言,我会使用SQL来进行比较。它更强大,更灵活。一个简单的例子可能是:

conn = psycopg2.connect(conn_string)

cursor = conn.cursor()

wb = openpyxl.load_workbook(input_filename)
sheet = wb.get_sheet_by_name('new_it_users')

for rowNum, row in tqdm(enumerate(sheet.iter_rows(), start=1)):
    it_user = sheet.cell(row=rowNum, column=1).value
    cursor.execute('select username from ituserlist where username = %s', (it_user,))
    for row in cursor.fetchall():
        #this will only run if the user was found
        sheet.cell(row=rowNum, column=6).value = "Existing User Found"
        break #keep the else: from running
    else:
        #no user found, set not found error
        sheet.cell(row=rowNum, column=6).value = "No User Found"

wb.save(output_filename)

cursor.close()
conn.close()