异步操作SQLAlchemy

这段Python代码使用了异步编程和SQLAlchemy ORM(对象关系映射)库来与数据库进行交互。代码的主要功能包括数据表的创建、数据查询以及数据插入。下面是对代码的详细解释:

  1. 异步函数定义:

    async def main():

    定义了一个异步函数main,这是异步编程的基础,允许函数在等待I/O操作(如数据库查询)完成时释放控制权。

  2. 异步数据迁移:

    async with db.engine.begin() as conn: await conn.run_sync(db.Model.metadata.create_all)

    这部分代码使用了一个异步上下文管理器db.engine.begin()来开始一个数据库事务。在这个事务中,它调用了create_all方法来创建当前程序中所有模型对应的数据表,如果这些表还不存在的话。run_sync方法用于在异步上下文中同步执行SQLAlchemy的create_all函数。

  3. 开启会话并进行查询和插入:

    async with db.async_session() as session: async with session.begin():

    这里使用另一个异步上下文管理器db.async_session()来开启一个异步会话。在这个会话中,再次使用session.begin()开启了一个事务,用于执行查询和插入操作。

  4. 查询数据:

    sql = db.select(Student).filter(Student.classes == 305).order_by(Student.id) student = await session.execute(sql) print(student.first()) print(student.mappings().all())
    • 构建了一个查询语句,选择Student模型中classes等于305的记录,并按id排序。
    • 使用await session.execute(sql)异步执行查询。
    • student.first()获取查询结果中的第一条记录。
    • student.mappings().all()获取查询结果的所有记录,并以字典形式返回。
  5. 写入数据:

    student1 = Student(name="小明1号", classes="302", sex=True, age=18, description="滚出去..") # ...(其他学生对象的创建) session.add(student1) session.add_all([student1, student2, student3, student4]) await session.commit()
    • 创建了几个Student对象,代表要插入数据库的学生记录。
    • 使用session.add(student1)添加单个学生记录到会话中。
    • 使用session.add_all([...])添加多个学生记录到会话中。注意这里有一个错误:student1被重复添加了,这可能是一个编码时的疏忽。
    • 使用await session.commit()异步提交事务,将所有添加到会话中的记录保存到数据库中。

注意事项:

  • 代码中有一行被注释掉了:

    # await conn.run_sync(Model.metadata.drop_all)

    这行代码如果取消注释,将会删除当前程序中所有模型对应的数据表。这通常用于重置数据库到初始状态,但在生产环境中使用时需要谨慎。

  • 异步编程和SQLAlchemy的结合使得数据库操作更加高效,特别是在I/O密集型的应用中,因为它允许在等待数据库响应的同时执行其他任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值