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()
答案 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()