You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:04:04