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()
相关推荐
程序员爱钓鱼2 小时前
Python编程实战 · 基础入门篇 | 元组(tuple)
后端·python·ipython
程序员爱钓鱼2 小时前
Python编程实战 · 基础入门篇 | 列表(list)
后端·python·ipython
像风一样!3 小时前
MySQL Galera Cluster部署如何实现负载均衡和高可用
数据库·mysql
御承扬4 小时前
编程素养提升之EffectivePython(Builder篇)
python·设计模式·1024程序员节
last_zhiyin4 小时前
Oracle sql tuning guide 翻译 Part 6-4 --- Hint使用准则和Hint使用报告
数据库·sql·oracle·sql tunning
chenchihwen4 小时前
AI代码开发宝库系列:FAISS向量数据库
数据库·人工智能·python·faiss·1024程序员节
小光学长5 小时前
基于Vue的课程达成度分析系统t84pzgwk(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
摇滚侠5 小时前
全面掌握PostgreSQL关系型数据库,备份和恢复,笔记46和笔记47
java·数据库·笔记·postgresql·1024程序员节
AI视觉网奇6 小时前
json 可视化 2025 coco json
python·1024程序员节
周杰伦fans6 小时前
Navicat - 连接 mysql 、 sqlserver 数据库 步骤与问题解决
数据库·mysql·sqlserver