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()
相关推荐
一瓢西湖水20 小时前
列式数据库-以clickHouse为例
数据库·clickhouse
Elastic 中国社区官方博客20 小时前
使用 Elastic Cloud Serverless 扩展批量索引
大数据·运维·数据库·elasticsearch·搜索引擎·云原生·serverless
liulanba20 小时前
AI Agent技术完整指南 第一部分:基础理论
数据库·人工智能·oracle
逆天小北鼻21 小时前
Oracle 服务端与客户端的核心区分要点
数据库·oracle
2501_9462429321 小时前
MPV-EASY Player (MPV播放器) v0.41.0.1
数据库·经验分享·云计算·计算机外设·github·电脑·csdn开发云
秃了也弱了。21 小时前
python实现定时任务:schedule库、APScheduler库
开发语言·python
Dfreedom.21 小时前
从 model(x) 到__call__:解密深度学习框架的设计基石
人工智能·pytorch·python·深度学习·call
weixin_4250230021 小时前
Spring Boot 配置文件优先级详解
spring boot·后端·python
MySQL实战1 天前
Redis 7.0 新特性之maxmemory-clients:限制客户端内存总使用量
数据库·redis
VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue校园社团管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计