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()
相关推荐
kexnjdcncnxjs几秒前
Redis如何记录每一次写操作_开启AOF持久化机制实现命令级追加记录
jvm·数据库·python
程序媛徐师姐7 分钟前
Python基于Django的小区果蔬预定系统【附源码、文档说明】
python·django·小区果蔬预定系统·果蔬预定·python小区果蔬预定系统·小区果蔬预定·python果蔬预定系统
小何code19 分钟前
人工智能【第8篇】监督学习实战:线性回归与逻辑回归算法详解(万字长文+完整代码实现)
人工智能·python·学习·机器学习·逻辑回归·线性回归
EnCi Zheng20 分钟前
M5-markconv自定义CSS样式指南 [特殊字符]
前端·css·python
逸Y 仙X28 分钟前
文章十九: ElasticSearch Full Text 全文本查询
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
STER labo29 分钟前
mysql配置环境变量——(‘mysql‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法)
数据库·mysql·adb
刘~浪地球32 分钟前
DeepSeek V4 应用实战:构建智能数据分析Agent
python·数据挖掘·数据分析
微软技术分享32 分钟前
本地部署千问 2.5-1.5B-GGUF + LangChain 封装学习
数据库·学习·langchain
嘻嘻哈哈樱桃39 分钟前
牛客经典101题解题集--贪心算法+模拟
java·python·算法·贪心算法