Python-模块篇(数据库与邮件、sqlite3、PyMySQL、email、smtplib)

1、数据库-sqlite3(Python内置,无需安装)

SQLite是轻量级嵌入式数据库,适合单机应用、移动端或测试环境。

基本流程

import sqlite3

# 1. 连接数据库(文件不存在会自动创建)
conn = sqlite3.connect('example.db')

# 2. 创建游标对象(用于执行SQL)
cursor = conn.cursor()

# 3. 执行SQL语句(创建表)
cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER,
        email TEXT UNIQUE
    )
''')

# 4. 提交事务(增删改操作后必须提交)
conn.commit()

# 5. 关闭连接
conn.close()
插入数据
# 方式1:直接执行
cursor.execute("INSERT INTO users (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com')")

# 方式2:参数化查询(推荐,防SQL注入)
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", ('李四', 30, 'lisi@example.com'))

# 方式3:批量插入
users = [('王五', 22, 'wangwu@ex.com'), ('赵六', 28, 'zhaoliu@ex.com')]
cursor.executemany("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", users)
conn.commit()

更新与删除

# 更新
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, '张三'))
conn.commit()

# 删除
cursor.execute("DELETE FROM users WHERE id = ?", (1,))
conn.commit()

 

 

查询数据

# 查询所有
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()        # 返回列表,每个元素是元组
for row in rows:
    print(row)

# 查询一条
cursor.execute("SELECT * FROM users WHERE id = ?", (1,))
row = cursor.fetchone()         # 返回单个元组或None

# 查询多条(带条件)
cursor.execute("SELECT * FROM users WHERE age > ?", (20,))
rows = cursor.fetchmany(5)      # 获取前5条

2、数据库-PyMySQL(需安装:pip install pymysql

PyMySQL是连接MySQL数据库的驱动,适合Web应用、服务端项目。

基本流程
import pymysql

# 1. 建立连接(需提供主机、用户、密码、数据库名)
conn = pymysql.connect(
    host='localhost',      # 或 '127.0.0.1'
    user='root',
    password='123456',
    database='test_db',
    charset='utf8mb4',
    autocommit=False       # 默认关闭自动提交,需手动commit
)

# 2. 创建游标(默认返回元组,如需字典格式需指定)
cursor = conn.cursor()                     # 返回元组
# cursor = conn.cursor(pymysql.cursors.DictCursor)  # 返回字典

# 3. 执行SQL
cursor.execute("SELECT VERSION()")         # 测试连接
version = cursor.fetchone()
print(version)

# 4. 关闭
cursor.close()
conn.close()

插入数据(参数化用 %s 占位)

# 单条插入
sql = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s)"
cursor.execute(sql, ('张三', 25, 'zhangsan@ex.com'))
conn.commit()    # 必须提交

# 批量插入
data = [('李四', 30, 'lisi@ex.com'), ('王五', 22, 'wangwu@ex.com')]
cursor.executemany(sql, data)
conn.commit()

 更新与删除

cursor.execute("UPDATE users SET age = %s WHERE name = %s", (26, '张三'))
conn.commit()

cursor.execute("DELETE FROM users WHERE id = %s", (1,))
conn.commit()

 查询数据

cursor.execute("SELECT * FROM users WHERE age > %s", (20,))
rows = cursor.fetchall() #获取所有记录
rows = cursor.fetchone() #获取1条记录
for row in rows:
    print(row)

# 如果使用DictCursor,则通过列名访问
# print(row['name'], row['age'])

3、数据库-ORM介绍

ORM框架(Python的SQLAlchemy):Object-Relational Mapping、对象关系映射

定义:将对象和关系数据库进行相互映射(解决对象和关系型数据库之间的数据交互问题)。

数据库 程序
映射为类
表中的记录(一行) 映射为对象
表中的字段(一列) 映射为对象的属性

作用:配置好映射关系后,ORM可以自动生成SQL语句,自动将对象中的数据存储到数据库,也可以将数据库中的数据提取到对象中。

4、邮件-email(构造邮件)

文本邮件

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

# ========== 1. 配置发件信息 ==========
sender_email = 'your_email@qq.com'
receiver_email = 'receiver@example.com'

# ========== 2. 构建邮件内容 ==========
subject = 'Python邮件测试' #邮件主题
content = '这是一封来自Python的测试邮件。' #字符串内容

# 构建MIMEText对象:内容、文本类型、编码
msg = MIMEText(content, 'plain', 'utf-8') #构造邮件内容、纯文本
msg['From'] = Header(sender_email)          # 发件人
msg['To'] = Header(receiver_email)          # 收件人
msg['Subject'] = Header(subject, 'utf-8')   # 主题



html_content = '''
<h2>Python邮件测试</h2>
<p>这是一封 <b>HTML</b> 格式的邮件,支持<font color="red">彩色文字</font>和<a href="https://www.python.org">链接</a>。</p>
'''

msg = MIMEText(html_content, 'html', 'utf-8') #构造邮件内容、html文本

附件邮件(图片、PDF、Excel等)

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.header import Header

# ========== 1. 创建邮件容器 ==========
msg = MIMEMultipart()  #使用 MIMEMultipart 作为容器,然后把正文和各附件分别添加进去
msg['From'] = Header(sender_email)
msg['To'] = Header(receiver_email)
msg['Subject'] = Header('带附件的邮件', 'utf-8')

# ========== 2. 添加正文 ==========
body = MIMEText('请查收附件中的报告。', 'plain', 'utf-8')
msg.attach(body) #添加内容到邮件

# ========== 3. 添加附件 ==========
file_path = 'report.pdf'   # 附件路径

with open(file_path, 'rb') as f:
    # MIMEBase表示未知类型的附件,用'application/octet-stream'
    part = MIMEBase('application', 'octet-stream')
    part.set_payload(f.read())
    # 编码为Base64
    encoders.encode_base64(part)
    # 设置附件头,指定文件名
    part.add_header(
        'Content-Disposition',
        f'attachment; filename={Header("报告.pdf", "utf-8").encode()}'
    )
    msg.attach(part) #添加内容到邮件

#只适合附件文件名固定是英文或数字,遇到中文容易乱码
msg["Content-Disposition"] = 'attachment; filename="report.pdf"'

5、邮件-smtplib(发送邮件)

# ==========发送邮件 ==========
import smtplib

# ========== 1. 配置发件信息 ==========
smtp_server = 'smtp.qq.com'        # SMTP服务器地址(以QQ邮箱为例)
smtp_port = 465                    # SSL端口(明文传输是25端口,程序可能阻止)
sender_email = 'your_email@qq.com'
sender_password = 'xxxxxxxxxxxx'   # 邮箱授权码(不是登录密码!)
receiver_email = 'receiver@example.com'

try:
    # 使用SSL加密连接(适合465端口)
    server = smtplib.SMTP_SSL(smtp_server, smtp_port)
    # 登录
    server.login(sender_email, sender_password)
    # 发送:发件人,收件人(可以是列表),邮件内容(需要转为字符串)
    server.sendmail(sender_email, [receiver_email], msg.as_string())
    print("邮件发送成功!")
except Exception as e:
    print(f"发送失败:{e}")
finally:
    server.quit()
posted @ 2026-07-23 14:32  FengweiTech  阅读(13)  评论(0)    收藏  举报