• 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,以便在循环体内使用。

    1. from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
    2. from sqlalchemy.orm import declarative_base
    3. from sqlalchemy.orm import relationship, sessionmaker
    4. # 创建数据库连接和会话
    5. engine = create_engine('sqlite:///usersexample.db')
    6. Base = declarative_base()
    7. Session = sessionmaker(bind=engine)
    8. session = Session()
    9. # 定义模型
    10. class User(Base):
    11. __tablename__ = 'users'
    12. id = Column(Integer, primary_key=True)
    13. name = Column(String, unique=True) # 添加了唯一性约束
    14. profile = relationship('UserProfile', uselist=False, backref='user')
    15. class UserProfile(Base):
    16. __tablename__ = 'user_profiles'
    17. id = Column(Integer, primary_key=True)
    18. bio = Column(String)
    19. user_id = Column(Integer, ForeignKey('users.id'))
    20. # 创建表格
    21. Base.metadata.create_all(engine)
    22. # 创建10个用户
    23. users_data = [
    24. {"name": "Alice", "bio": "I'm a software engineer."},
    25. {"name": "Bob", "bio": "I love hiking."},
    26. {"name": "Charlie", "bio": "Music is my passion."},
    27. {"name": "David", "bio": "I'm a foodie."},
    28. {"name": "Eve", "bio": "I'm a bookworm."},
    29. {"name": "Frank", "bio": "I'm a fitness enthusiast."},
    30. {"name": "Grace", "bio": "I'm a photographer."},
    31. {"name": "Hank", "bio": "I'm a travel blogger."},
    32. {"name": "Ivy", "bio": "I'm a painter."},
    33. {"name": "Jack", "bio": "I'm a movie buff."}
    34. ]
    35. # 创建用户之前先检查数据库中是否已存在相同名称的用户
    36. for user_data in users_data:
    37. user = session.query(User).filter_by(name=user_data["name"]).first()
    38. if user is None:
    39. user = User(name=user_data["name"])
    40. profile = UserProfile(bio=user_data["bio"])
    41. user.profile = profile
    42. session.add(user)
    43. # 提交事务
    44. session.commit()
    45. # 查询功能丰富示例
    46. # 查询所有用户及其用户资料
    47. all_users = session.query(User).all()
    48. for user in all_users:
    49. print(f"User {user.name}: {user.profile.bio}")
    50. # 查询特定用户的用户资料
    51. specific_user = session.query(User).filter(User.name == 'Alice').first()
    52. if specific_user:
    53. print(f"User {specific_user.name}: {specific_user.profile.bio}")
    54. # 其他数据库操作示例
    55. # 更新用户资料
    56. specific_user.profile.bio = "I'm a data scientist."
    57. session.commit()
    58. # 查找并删除重复的用户
    59. from collections import Counter
    60. # 找出所有重复的用户
    61. names = [user.name for user in all_users]
    62. duplicate_names = [name for name, count in Counter(names).items() if count > 1]
    63. # 删除所有重复的用户
    64. for name in duplicate_names:
    65. duplicate_users = session.query(User).filter(User.name == name).all()
    66. for user in duplicate_users[1:]:
    67. session.delete(user)
    68. # 提交事务
    69. session.commit()
    70. # 关闭会话
    71. session.close()

  • 相关阅读:
    程序员常用的19款办公软件和开发工具推荐!
    STM32F429主控TB6612驱动直流电机----解决PWM波形未输出bug
    [翻译][推荐阅读]高并发网络架构
    vcomp100.dll丢失怎样修复?5个靠谱的修复方法分享
    java企业员工健康体检预约系统 python/php小程序 医院体检预约系统
    【OpenMV】AprilTag标记跟踪 NCC模板匹配 测距与测量物体大小
    自动驾驶--高精地图技术
    c 语言基础:L1-038 新世界
    linux学习(4)—— 在linux系统上安装软件
    ChatGPT私有数据结合有什么效果?它难吗?
  • 原文地址:https://blog.csdn.net/book_dw5189/article/details/134084842