• PYTHON利用SQLAlchemy库高效操作关联的数据表


    SQLAlchemy是一个Python库,用于处理关系型数据库的ORM(对象关系映射)和SQL表达式的生成。它提供了许多功能,包括:

    1. ORM(对象关系映射):允许将数据库表映射到Python对象,使开发人员可以使用Python代码而不是SQL语句来操作数据库。

    2. 数据库连接管理:SQLAlchemy管理数据库连接池,处理连接的创建、关闭和连接池的配置,从而提高了性能和资源利用率。

    3. SQL表达式语言:SQLAlchemy提供了强大的SQL表达式语言,可以用于构建SQL查询、插入、更新和删除等操作,同时支持数据库的不同类型和方言。

    4. 事务管理:支持数据库事务,确保一系列数据库操作的原子性和数据一致性。

    5. 连接多种数据库:SQLAlchemy支持多种关系型数据库,包括SQLite、MySQL、PostgreSQL、Oracle等,使得代码可以跨不同数据库进行移植。

    6. 数据模型定义:使用SQLAlchemy,可以定义数据模型类,这些类可以映射到数据库表,简化了数据库结构的管理。

    7. 查询构建:SQLAlchemy允许使用Python代码来构建复杂的查询,支持过滤、排序、连接、子查询等功能。

    8. 双向关系:通过定义双向关系,可以轻松地在数据模型之间进行导航和访问相关的数据。

    9. 批量操作:支持批量插入、批量更新和批量删除等操作,提高了数据库操作的效率。

    10. 数据类型转换:SQLAlchemy支持将Python数据类型与数据库数据类型进行映射,处理数据的序列化和反序列化。

    11. 表间关联:支持多表之间的关联,包括一对一、一对多和多对多等关系的建立和管理。

    总之,SQLAlchemy是一个功能强大的工具,用于处理数据库交互和数据持久化,它提供了高度抽象的方式来操作数据库,同时支持灵活的SQL表达式,使开发人员更容易管理和操作数据库。

    1. from sqlalchemy import create_engine, Column, Integer, String
    2. from sqlalchemy.orm import sessionmaker
    3. from sqlalchemy.orm import declarative_base
    4. from sqlalchemy import ForeignKey
    5. from sqlalchemy.orm import relationship, joinedload
    6. from sqlalchemy import UniqueConstraint
    7. from sqlalchemy import func
    8. from sqlalchemy import distinct
    9. # 创建引擎
    10. engine = create_engine('sqlite:///test456.db')
    11. # 创建会话
    12. Session = sessionmaker(bind=engine)
    13. session = Session()
    14. # 创建 SQLAlchemy 数据模型基类
    15. Base = declarative_base()
    16. # 定义数据模型类,继承自 Base
    17. class Address(Base):
    18. __tablename__ = 'addresses'
    19. id = Column(Integer, primary_key=True)
    20. user_id = Column(Integer, ForeignKey('users.id'))
    21. street = Column(String)
    22. user = relationship('User', back_populates='addresses')
    23. __table_args__ = (
    24. UniqueConstraint('user_id', 'street', name='unique_user_address'),
    25. )
    26. class User(Base):
    27. __tablename__ = 'users'
    28. id = Column(Integer, primary_key=True)
    29. name = Column(String)
    30. age = Column(Integer)
    31. addresses = relationship('Address', back_populates='user')
    32. # 创建数据库表
    33. Base.metadata.create_all(engine)
    34. # 插入用户数据
    35. user1 = User(name='Alice', age=30)
    36. user2 = User(name='Bob', age=25)
    37. # 插入地址数据
    38. address1 = Address(street='123 Main St', user=user1)
    39. address3 = Address(street='789 Oak St', user=user2)
    40. session.add(user1)
    41. session.add(user2)
    42. session.commit()
    43. # 查询所有用户以验证插入操作
    44. users = session.query(User).all()
    45. print('\nquery all users')
    46. for user in users:
    47. print(f"ID: {user.id:2} | Name: {user.name:7} | Age: {user.age:4}")
    48. # 执行关联查询并输出完整的用户信息
    49. users_with_addresses = session.query(User).options(joinedload(User.addresses)).all()
    50. print(' \n执行关联查询并输出完整的用户信息')
    51. for user in users_with_addresses:
    52. user_info = f"User ID: {user.id:3}, Name: {user.name:10}, Age: {user.age:4}"
    53. for address in user.addresses:
    54. address_info = f", Street: {address.street}"
    55. print(user_info.ljust(40) + address_info)
    56. # for user in users_with_addresses:
    57. # print(f"User ID: {user.id}, Name: {user.name}, Age: {user.age}, Street: {', '.join([address.street for address in user.addresses])}")
    58. # for user in users_with_addresses:
    59. # print(f"User ID: {user.id}, Name: {user.name}, Age: {user.age}")
    60. # for address in user.addresses:
    61. # print(f" Address ID: {address.id}, Street: {address.street}")
    62. # 查询重复的用户记录
    63. duplicate_users = (
    64. session.query(User)
    65. .group_by(User.name, User.age)
    66. .having(func.count(User.id) > 1)
    67. .all()
    68. )
    69. # 删除重复记录,保留第一个记录
    70. for user in duplicate_users:
    71. first_user = (
    72. session.query(User)
    73. .filter_by(name=user.name, age=user.age)
    74. .order_by(User.id)
    75. .first()
    76. )
    77. session.query(User).filter_by(name=user.name, age=user.age).delete(synchronize_session=False)
    78. session.commit()
    79. # 查询所有用户以验证删除操作
    80. users = session.query(User).all()
    81. print(' \nquery all users')
    82. for user in users:
    83. print(f"ID: {user.id:3} | Name: {user.name:10} | Age: {user.age:4}")
    84. # 查询所有的地址
    85. all_addresses = session.query(Address).all()
    86. # 获取用户的 ID 列表
    87. user_ids = [user.id for user in session.query(User).all()]
    88. # 删除不对应的地址信息
    89. for address in all_addresses:
    90. if address.user_id not in user_ids:
    91. session.delete(address)
    92. session.commit()
    93. # 查询 Address 表以验证删除操作
    94. addresses = session.query(Address).all()
    95. print(' \nquery all addresses')
    96. for address in addresses:
    97. print(f"ID: {address.id:2} | Street: {address.street:20} | User ID: {address.user_id}")

  • 相关阅读:
    Python3中用户注册小案例 - 解决中文字符问题 (代码)
    [旭日X3派] 初识篇 - 01
    c进阶测试题
    Xamarin实现App展示启动界面
    go基础07-了解map实现原理并高效使用
    redis缓存基本使用和缓存问题解决
    头歌MySQL数据库实训答案 有目录
    51单片机笔记:定时器/计数器
    【Vue】使用 Composition API 开发TodoList(2)
    ​LeetCode解法汇总1465. 切割后面积最大的蛋糕
  • 原文地址:https://blog.csdn.net/book_dw5189/article/details/134067536