Python删除数据库数据的常见方法
使用 MySQL 数据库
import mysql.connector
try:
# 连接数据库
conn = mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database"
)
cursor = conn.cursor()
# 删除单条记录
sql = "DELETE FROM users WHERE id = %s"
user_id = (1,)
cursor.execute(sql, user_id)
# 删除多条记录
sql = "DELETE FROM users WHERE age > %s"
age_limit = (30,)
cursor.execute(sql, age_limit)
# 提交事务
conn.commit()
print(f"删除了 {cursor.rowcount} 条记录")
except mysql.connector.Error as err:
print(f"错误: {err}")
conn.rollback() # 出错时回滚
finally:
if conn.is_connected():
cursor.close()
conn.close()
使用 SQLite 数据库
import sqlite3
def delete_data():
try:
# 连接数据库(自动创建)
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
# 创建测试表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)
''')
# 删除单条记录
cursor.execute("DELETE FROM users WHERE id = ?", (3,))
# 删除满足条件的记录
cursor.execute("DELETE FROM users WHERE age < ?", (18,))
# 删除所有记录(清空表)
cursor.execute("DELETE FROM users")
conn.commit()
print(f"删除了 {cursor.rowcount} 条记录")
except sqlite3.Error as e:
print(f"SQLite错误: {e}")
conn.rollback()
finally:
cursor.close()
conn.close()
delete_data()
使用 PostgreSQL 数据库
import psycopg2
try:
conn = psycopg2.connect(
host="localhost",
database="your_database",
user="your_username",
password="your_password"
)
cursor = conn.cursor()
# 删除特定条件的记录
cursor.execute("""
DELETE FROM employees
WHERE department = %s
AND salary < %s
""", ('Sales', 50000))
# 删除所有记录
cursor.execute("DELETE FROM employees")
conn.commit()
print(f"删除记录数: {cursor.rowcount}")
except psycopg2.Error as e:
print(f"数据库错误: {e}")
conn.rollback()
finally:
if conn:
cursor.close()
conn.close()
使用 SQLAlchemy ORM(推荐)
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
# 连接数据库
engine = create_engine('sqlite:///users.db', echo=True)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# 方法1: 删除指定记录
user = session.query(User).filter_by(id=1).first()
if user:
session.delete(user)
session.commit()
# 方法2: 批量删除
session.query(User).filter(User.age < 18).delete()
session.commit()
# 方法3: 删除所有记录
session.query(User).delete()
session.commit()
session.close()
使用 Django ORM 示例
# models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
# views.py 或脚本中
def delete_users():
# 删除指定记录
user = User.objects.get(id=1)
user.delete()
# 批量删除
User.objects.filter(age__lt=18).delete() # 删除年龄小于18的用户
# 删除所有记录
User.objects.all().delete()
使用 with 语句的简化版本
import mysql.connector
from contextlib import closing
with closing(mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="test"
)) as conn:
with conn.cursor() as cursor:
# 删除记录
cursor.execute("DELETE FROM products WHERE price = 0")
conn.commit()
print(f"删除了 {cursor.rowcount} 条免费商品")
关键注意事项
- 始终使用参数化查询:防止 SQL 注入攻击
- 记得提交事务:
conn.commit() - 异常处理:使用 try-except 捕获错误
- 资源释放:关闭游标和连接
- 备份数据:重要数据删除前先备份
安全建议
# 安全的删除方法(防止SQL注入)
def safe_delete_user(user_id):
cursor.execute("DELETE FROM users WHERE id = %s", (user_id,))
# 不安全的做法(容易SQL注入)
def unsafe_delete_user(user_id):
cursor.execute(f"DELETE FROM users WHERE id = {user_id}") # 危险!
选择哪种方式取决于你使用的数据库类型和项目的框架要求,如果是简单项目,建议使用 sqlite3;如果是专业项目,推荐使用 SQLAlchemy 或 Django ORM。
