如何将SQL查询结果存入变量并实现数据库查询结果邮件发送?
解决SQL结果捕获与邮件发送的问题
我来帮你搞定这两个需求,直接上实用的代码和说明:
1. 将SQL查询结果捕获到变量中
你的SQL执行语句已经写好了,接下来只需要用游标对象的fetchall()(取所有结果)或者fetchone()(取单条结果)方法,就能把查询结果存到变量里。如果是多行结果,fetchall()会返回一个元组的列表,每一个元组对应查询结果的一行数据:
# 执行SQL后,捕获全部结果 results = cursor.fetchall() # 要是想把结果转成更易读的字典列表(键对应列名),可以这么做 column_names = [desc[0] for desc in cursor.description] results_dict = [dict(zip(column_names, row)) for row in results]
这样results就是原始的查询结果集合,results_dict是字典格式的结果,后续处理邮件内容会更方便。
2. 完整实现:查询数据库并发送邮件
我把数据库查询和邮件发送逻辑整合到了一起,你只需要替换代码里的配置项就能直接用:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import MySQLdb import datetime def send_db_report_email(): # 1. 数据库连接与查询逻辑 db_config = { "host": "你的数据库地址", "user": "你的数据库账号", "passwd": "你的数据库密码", "db": "目标数据库名" } try: db = MySQLdb.connect(**db_config) cursor = db.cursor() # 执行你的SQL查询(补全了排序逻辑,可按需调整) sql_query = """ SELECT report_date, ROUND(SUM(balance), 2) as 'Net', ROUND(SUM(short_mkt_value), 2) as 'Short', ROUND(SUM(int_balance ), 2) as 'Long' FROM intersum_recap WHERE group_name = 'Carter' GROUP BY report_date ORDER BY report_date DESC """ cursor.execute(sql_query) # 捕获结果并格式化为HTML表格(邮件显示更美观) column_names = [desc[0] for desc in cursor.description] results = cursor.fetchall() html_content = "<h3>Carter组账户余额报告</h3>" html_content += "<table border='1'><tr>" # 添表格表头 for col in column_names: html_content += f"<th>{col}</th>" html_content += "</tr>" # 添加数据行 for row in results: html_content += "<tr>" for item in row: # 日期格式友好化处理 if isinstance(item, datetime.date): html_content += f"<td>{item.strftime('%Y-%m-%d')}</td>" else: html_content += f"<td>{item}</td>" html_content += "</tr>" html_content += "</table>" # 2. 准备邮件内容 msg = MIMEMultipart() msg['From'] = "发件人邮箱@xxx.com" msg['To'] = "收件人邮箱@xxx.com" msg['Subject'] = f"账户余额报告 - {datetime.datetime.now().strftime('%Y-%m-%d')}" # 同时添加HTML和纯文本版本,兼容所有邮箱客户端 msg.attach(MIMEText(html_content, 'html')) # 把HTML转成纯文本格式 plain_text = html_content.replace('<br>', '\n').replace('<table border="1">', '\n') plain_text = plain_text.replace('</tr>', '\n').replace('<td>', ' | ').replace('</td>', '') plain_text = plain_text.replace('<th>', ' | ').replace('</th>', '').replace('</table>', '') msg.attach(MIMEText(plain_text, 'plain')) # 3. 发送邮件 smtp_server = "smtp.xxx.com" # 比如smtp.gmail.com或企业邮箱SMTP地址 smtp_port = 587 # 常用端口:587(TLS)或465(SSL) smtp_user = "发件人邮箱@xxx.com" smtp_pass = "邮箱密码/授权码" # 部分邮箱需要用授权码而非登录密码 with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() server.login(smtp_user, smtp_pass) server.send_message(msg) print("邮件发送成功!") except Exception as e: print(f"执行出错:{str(e)}") finally: # 确保数据库连接关闭,避免资源泄漏 if 'cursor' in locals(): cursor.close() if 'db' in locals(): db.close() # 执行发送函数 send_db_report_email()
几个关键注意点:
- 替换代码里的数据库配置和邮箱配置,比如SMTP服务器地址、端口、账号密码(Gmail、QQ邮箱等需要用授权码)
- 我把查询结果转成了HTML表格,邮件里显示更清晰,同时附带了纯文本版本,兼容所有邮箱客户端
- 加了异常处理和数据库连接的关闭逻辑,避免程序异常时资源占用
- SQL里的
ORDER BY补全了report_date DESC,你可以根据实际需求调整排序规则
内容的提问来源于stack exchange,提问作者user8162541
相关产品推荐
相关产品推荐

