IT评测·应用市场-qidao123.com技术社区

标题: 【Python】使用SQLAlchemy操纵Mysql数据库 [打印本页]

作者: 我可以不吃啊    时间: 2024-7-27 03:03
标题: 【Python】使用SQLAlchemy操纵Mysql数据库
一、SQLAlchemy 介绍

SQLAlchemy是Python的SQL工具包和对象关系映射(ORM)库,它提供了全套的企业级持久性模子,用于高效、机动且优雅地与关系型数据库举行交互。使用SQLAlchemy,你可以通过Python类来界说数据库表的结构,并通过这些类与数据库举行交互,而无需编写复杂的SQL语句。
以下是SQLAlchemy的一些重要特点和功能:
二、使用步骤(示例)

以下是一个使用SQLAlchemy连接到MySQL数据库并举行基本操纵的例子:
1. 安装所需的库

首先,确保你已经安装了SQLAlchemy和MySQL的Python驱动。你可以使用pip来安装它们:
  1. pip install sqlalchemy pymysql
复制代码
2. 连接到MySQL数据库

  1. from sqlalchemy import create_engine
  2. # 替换为你的MySQL数据库信息
  3. username = 'your_mysql_username'
  4. password = 'your_mysql_password'
  5. host = 'your_mysql_host'  # 例如:'localhost' 或 '127.0.0.1'
  6. port = 'your_mysql_port'  # 通常是 3306
  7. database = 'your_database_name'
  8. # 创建连接引擎
  9. engine = create_engine(f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}')
复制代码
3. 界说模子

接下来,我们界说一个模子来表示我们想要在数据库中存储的数据。
  1. from sqlalchemy import Column, Integer, String
  2. from sqlalchemy.ext.declarative import declarative_base
  3. Base = declarative_base()
  4. class User(Base):
  5.     __tablename__ = 'users'
  6.     id = Column(Integer, primary_key=True)
  7.     name = Column(String)
  8.     email = Column(String)
复制代码
4. 创建表

在数据库中创建表。
  1. Base.metadata.create_all(engine)
复制代码
5. 添加数据

  1. from sqlalchemy.orm import sessionmaker
  2. # 创建会话
  3. Session = sessionmaker(bind=engine)
  4. session = Session()
  5. # 添加新用户
  6. new_user = User(name='John Doe', email='john.doe@example.com')
  7. session.add(new_user)
  8. session.commit()
  9. # 关闭会话
  10. session.close()
复制代码
6. 查询数据

  1. session = Session()
  2. # 查询所有用户
  3. users = session.query(User).all()
  4. for user in users:
  5.     print(f"User ID: {user.id}, Name: {user.name}, Email: {user.email}")
  6. # 关闭会话
  7. session.close()
复制代码
请确保在运行代码之前,你已经正确配置了MySQL服务器,并且替换了上述代码中的数据库连接信息(用户名、密码、主机、端口和数据库名)。
这个例子展示了如何使用SQLAlchemy连接到MySQL数据库,界说模子,创建表,添加数据,以及查询数据。在实际应用中,你可能还须要处置处罚更复杂的情况,好比关系、继承、事件管理等。SQLAlchemy提供了丰富的功能来满足这些需求。
三、结合事件使用(示例)

首先,确保你已经按照前面的示例设置好了SQLAlchemy和MySQL的连接。
1. 界说模子

我们继续使用前面的User模子。
  1. from sqlalchemy import Column, Integer, String
  2. from sqlalchemy.ext.declarative import declarative_base
  3. Base = declarative_base()
  4. class User(Base):
  5.     __tablename__ = 'users'
  6.     id = Column(Integer, primary_key=True, autoincrement=True)
  7.     name = Column(String)
  8.     email = Column(String)
复制代码
2. 初始化数据库连接和会话

  1. from sqlalchemy import create_engine
  2. from sqlalchemy.orm import sessionmaker
  3. # 连接到MySQL数据库(请替换为你的数据库信息)
  4. engine = create_engine('mysql+pymysql://user:password@localhost/dbname')
  5. Session = sessionmaker(bind=engine)
  6. session = Session()
复制代码
3. 使用事件添加用户

如今,我们将在一个事件中添加用户。如果添加过程中发生任何错误,我们将回滚事件,确保数据库的一致性。
  1. try:
  2.     # 开始一个新的事务
  3.     session.begin()
  4.    
  5.     # 创建新用户对象
  6.     user1 = User(name='Alice', email='alice@example.com')
  7.     user2 = User(name='Bob', email='bob@example.com')
  8.    
  9.     # 添加到会话中
  10.     session.add(user1)
  11.     session.add(user2)
  12.    
  13.     # 提交事务,将所有更改保存到数据库
  14.     session.commit()
  15.     print("Users added successfully.")
  16. except Exception as e:
  17.     # 如果在添加用户过程中发生错误,则回滚事务
  18.     session.rollback()
  19.     print(f"An error occurred: {e}")
  20. finally:
  21.     # 关闭会话
  22.     session.close()
复制代码
在这个示例中,我们使用session.begin()显式地开始了一个新的事件。然后,我们尝试添加两个新用户到会话中。如果在这个过程中没有发生任何错误,我们使用session.commit()提交事件,将全部更改保存到数据库中。但是,如果在添加用户的过程中发生了任何异常(例如,由于重复的电子邮件地点或数据库连接问题),我们将使用session.rollback()回滚事件,确保数据库的一致性。
请注意,为了简化示例,这里没有包含具体的错误处置处罚和验证逻辑。在实际应用中,你应该根据具体需求添加适当的错误处置处罚和验证。
四、复杂查询条件(示例)

以下是一些使用SQLAlchemy举行复杂查询的示例:
示例1:连接查询(Join)

假设我们有两个模子,User 和 Order,并且一个用户可以有多个订单。
  1. from sqlalchemy import Column, Integer, String, ForeignKey
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.orm import relationship
  4. Base = declarative_base()
  5. class User(Base):
  6.     __tablename__ = 'users'
  7.     id = Column(Integer, primary_key=True)
  8.     name = Column(String)
  9.     orders = relationship("Order", back_populates="user")
  10. class Order(Base):
  11.     __tablename__ = 'orders'
  12.     id = Column(Integer, primary_key=True)
  13.     user_id = Column(Integer, ForeignKey('users.id'))
  14.     product = Column(String)
  15.     quantity = Column(Integer)
  16.     user = relationship("User", back_populates="orders")
复制代码
如今,如果我们想要查询全部下过订单的用户及其订单信息,我们可以举行连接查询:
  1. from sqlalchemy.orm import joinedload
  2. # 加载所有用户的订单信息
  3. users_with_orders = session.query(User).options(joinedload(User.orders)).all()
  4. for user in users_with_orders:
  5.     print(f"User: {user.name}")
  6.     for order in user.orders:
  7.         print(f"  Order: {order.product}, Quantity: {order.quantity}")
复制代码
示例2:分组和聚合(Grouping and Aggregation)

假设我们想要统计每个用户下的订单总数。
  1. from sqlalchemy import func
  2. # 按用户分组,并计算每个用户的订单数量
  3. order_count_by_user = session.query(User.id, User.name, func.count(Order.id).label('order_count')).\
  4.     join(Order).group_by(User.id, User.name).all()
  5. for user_id, user_name, order_count in order_count_by_user:
  6.     print(f"User ID: {user_id}, Name: {user_name}, Order Count: {order_count}")
复制代码
示例3:子查询(Subquery)

如果我们想要找出订单数目凌驾匀称订单数目的用户,我们可以使用子查询。
  1. from sqlalchemy import func, select
  2. # 计算平均订单数量作为子查询
  3. avg_order_quantity = select([func.avg(Order.quantity).label('avg_quantity')]).select_from(Order).alias()
  4. # 查询订单数量超过平均值的用户及其订单信息
  5. users_above_avg = session.query(User, Order.product, Order.quantity).\
  6.     join(Order).filter(Order.quantity > avg_order_quantity.c.avg_quantity).all()
  7. for user, product, quantity in users_above_avg:
  8.     print(f"User: {user.name}, Product: {product}, Quantity: {quantity}")
复制代码
示例4:复杂筛选条件(Complex Filtering)

假设我们想要找到名字以“A”开头的用户,并且他们的订单中包含“apple”这个产物。
  1. # 查询名字以“A”开头的用户,且订单中包含“apple”产品的用户信息
  2. users_with_apple = session.query(User).join(Order).\
  3.     filter(User.name.startswith('A')).\
  4.     filter(Order.product.contains('apple')).\
  5.     distinct().all()  # 使用distinct()确保结果中的用户不重复
  6. for user in users_with_apple:
  7.     print(f"User: {user.name}")
复制代码
这些示例展示了SQLAlchemy在处置处罚复杂查询时的一些高级功能,包罗连接查询、分组聚合、子查询和复杂筛选条件。
请注意,这些示例代码可能须要根据你的具体数据库模子和表结构举行调整。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4