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

基于POC:如何用Python获取Snowflake查询结果并发送至邮箱?

实现步骤与代码示例

1. 捕获Snowflake插入记录数

使用Python Connector for Snowflake执行INSERT语句后,可通过游标对象的rowcount属性直接获取插入的记录数量;如果需要获取插入的具体数据,可在INSERT语句后添加RETURNING *子句,将结果转为DataFrame后统计或处理。

示例代码:

import snowflake.connector
import pandas as pd

# 初始化Snowflake连接
conn = snowflake.connector.connect(
    user='你的用户名',
    password='你的密码',
    account='你的账户标识',
    warehouse='你的仓库',
    database='你的数据库',
    schema='你的Schema'
)

# 执行INSERT语句并捕获结果
cursor = conn.cursor()
try:
    # 基础插入语句
    insert_query = "INSERT INTO target_table(col1, col2) VALUES ('val1', 'val2'), ('val3', 'val4')"
    cursor.execute(insert_query)
    inserted_rows = cursor.rowcount
    print(f"成功插入 {inserted_rows} 条记录")
    
    # 可选:获取插入的详细记录并转为DataFrame
    # cursor.execute("INSERT INTO target_table(col1) VALUES ('test') RETURNING *")
    # df = pd.DataFrame(cursor.fetchall(), columns=[desc[0] for desc in cursor.description])
    # inserted_rows = len(df)
finally:
    cursor.close()
    conn.close()

2. 发送邮件通知

使用Python内置的smtplib和email库,将捕获的插入记录数(或DataFrame内容)封装为邮件发送。如果需要展示DataFrame数据,可将其转为HTML表格嵌入邮件正文。

示例代码:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

def send_email(inserted_rows, df=None):
    # 邮件服务器配置
    smtp_server = 'smtp.xxx.com'  # 如smtp.gmail.com、smtp.qq.com
    smtp_port = 587
    sender_email = '你的发件邮箱'
    sender_pwd = '你的邮箱授权码'
    receiver_emails = ['收件人1@xxx.com', '收件人2@xxx.com']
    
    # 构造邮件正文
    content = f"<h3>Snowflake插入操作完成</h3><p>共插入 <strong>{inserted_rows}</strong> 条记录</p>"
    if df is not None:
        # 将DataFrame转为带样式的HTML表格
        html_table = df.to_html(index=False, border=1, classes='table table-bordered')
        content += "<h4>插入记录详情:</h4>" + html_table
    
    # 构建邮件对象
    msg = MIMEText(content, 'html', 'utf-8')
    msg['From'] = Header('Snowflake操作通知', 'utf-8')
    msg['To'] = Header('相关人员', 'utf-8')
    msg['Subject'] = Header(f"Snowflake插入结果通知:{inserted_rows}条记录", 'utf-8')
    
    # 发送邮件
    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()  # 启用TLS加密
        server.login(sender_email, sender_pwd)
        server.sendmail(sender_email, receiver_emails, msg.as_string())
        print("邮件发送成功")
    except Exception as e:
        print(f"邮件发送失败:{str(e)}")
    finally:
        server.quit()

3. 整合完整流程

将连接Snowflake、执行插入、捕获结果、发送邮件的逻辑整合为完整脚本:

import snowflake.connector
import pandas as pd
import smtplib
from email.mime.text import MIMEText
from email.header import Header

def get_snowflake_connection():
    return snowflake.connector.connect(
        user='你的用户名',
        password='你的密码',
        account='你的账户标识',
        warehouse='你的仓库',
        database='你的数据库',
        schema='你的Schema'
    )

def send_email(inserted_rows, df=None):
    smtp_server = 'smtp.xxx.com'
    smtp_port = 587
    sender_email = '你的发件邮箱'
    sender_pwd = '你的邮箱授权码'
    receiver_emails = ['收件人@xxx.com']
    
    content = f"<h3>Snowflake POC插入操作完成</h3><p>共插入 <strong>{inserted_rows}</strong> 条记录</p>"
    if df is not None:
        content += "<h4>插入记录详情:</h4>" + df.to_html(index=False, border=1)
    
    msg = MIMEText(content, 'html', 'utf-8')
    msg['From'] = Header('Snowflake POC通知', 'utf-8')
    msg['To'] = Header('相关人员', 'utf-8')
    msg['Subject'] = Header(f"Snowflake插入结果:{inserted_rows}条记录", 'utf-8')
    
    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()
        server.login(sender_email, sender_pwd)
        server.sendmail(sender_email, receiver_emails, msg.as_string())
        print("通知邮件发送成功")
    except Exception as e:
        print(f"邮件发送失败:{str(e)}")
    finally:
        server.quit()

if __name__ == "__main__":
    conn = None
    cursor = None
    try:
        conn = get_snowflake_connection()
        cursor = conn.cursor()
        
        # 执行INSERT语句
        insert_query = "INSERT INTO test_table(name, age) VALUES ('张三', 25), ('李四', 30)"
        cursor.execute(insert_query)
        inserted_rows = cursor.rowcount
        
        # 可选:获取插入的详细记录
        # cursor.execute("SELECT * FROM test_table WHERE name IN ('张三', '李四')")
        # df = pd.DataFrame(cursor.fetchall(), columns=[desc[0] for desc in cursor.description])
        
        # 发送通知邮件
        send_email(inserted_rows)  # 若有df则改为send_email(inserted_rows, df)
        
    except Exception as e:
        print(f"操作失败:{str(e)}")
        # 可选:发送失败通知
        # send_email(0)
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()

内容的提问来源于stack exchange,提问作者Rajalakshmi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:06:42