SQLAlchemy删除所有重复的用户|Counter类运用

Python标准库中的collections模块中的Counter类。Counter类用于计算可迭代对象中元素的出现次数,并以字典的形式返回结果,其中键是元素,值是该元素的出现次数。

for name, count in Counter(names).items() 是一个循环语句,它用于遍历Counter对象的所有项。

在这个循环中,Counter(names).items() 返回一个包含键-值对的元组的列表,其中键是用户名,值是该用户名在names列表中出现的次数 。例如,如果有两个用户具有相同的用户名,那么它们的用户名在names列表中就会出现两次。

因此,for name, count in Counter(names).items() 遍历了这个键-值对列表,并将键赋值给name,将值赋值给count,以便在循环体内使用。

python 复制代码
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import relationship, sessionmaker

# 创建数据库连接和会话
engine = create_engine('sqlite:///usersexample.db')
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()

# 定义模型
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String, unique=True)  # 添加了唯一性约束
    profile = relationship('UserProfile', uselist=False, backref='user')

class UserProfile(Base):
    __tablename__ = 'user_profiles'
    id = Column(Integer, primary_key=True)
    bio = Column(String)
    user_id = Column(Integer, ForeignKey('users.id'))

# 创建表格
Base.metadata.create_all(engine)

# 创建10个用户
users_data = [
    {"name": "Alice", "bio": "I'm a software engineer."},
    {"name": "Bob", "bio": "I love hiking."},
    {"name": "Charlie", "bio": "Music is my passion."},
    {"name": "David", "bio": "I'm a foodie."},
    {"name": "Eve", "bio": "I'm a bookworm."},
    {"name": "Frank", "bio": "I'm a fitness enthusiast."},
    {"name": "Grace", "bio": "I'm a photographer."},
    {"name": "Hank", "bio": "I'm a travel blogger."},
    {"name": "Ivy", "bio": "I'm a painter."},
    {"name": "Jack", "bio": "I'm a movie buff."}
]

# 创建用户之前先检查数据库中是否已存在相同名称的用户
for user_data in users_data:
    user = session.query(User).filter_by(name=user_data["name"]).first()
    if user is None:
        user = User(name=user_data["name"])
        profile = UserProfile(bio=user_data["bio"])
        user.profile = profile
        session.add(user)

# 提交事务
session.commit()

# 查询功能丰富示例
# 查询所有用户及其用户资料
all_users = session.query(User).all()
for user in all_users:
    print(f"User {user.name}: {user.profile.bio}")

# 查询特定用户的用户资料
specific_user = session.query(User).filter(User.name == 'Alice').first()
if specific_user:
    print(f"User {specific_user.name}: {specific_user.profile.bio}")

# 其他数据库操作示例
# 更新用户资料
specific_user.profile.bio = "I'm a data scientist."
session.commit()

# 查找并删除重复的用户
from collections import Counter

# 找出所有重复的用户
names = [user.name for user in all_users]
duplicate_names = [name for name, count in Counter(names).items() if count > 1]

# 删除所有重复的用户
for name in duplicate_names:
    duplicate_users = session.query(User).filter(User.name == name).all()
    for user in duplicate_users[1:]:
        session.delete(user)

# 提交事务
session.commit()

# 关闭会话
session.close()
相关推荐
Nturmoils42 分钟前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
曲幽5 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
渣波5 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
荣码5 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱14 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵16 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio20 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户03321266636721 小时前
使用 Python 从零创建 Word 文档
python
Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate