这段Python代码使用了异步编程和SQLAlchemy ORM(对象关系映射)库来与数据库进行交互。代码的主要功能包括数据表的创建、数据查询以及数据插入。下面是对代码的详细解释:
-
异步函数定义:
async def main():
定义了一个异步函数
main
,这是异步编程的基础,允许函数在等待I/O操作(如数据库查询)完成时释放控制权。 -
异步数据迁移:
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
函数。 -
开启会话并进行查询和插入:
async with db.async_session() as session: async with session.begin():
这里使用另一个异步上下文管理器
db.async_session()
来开启一个异步会话。在这个会话中,再次使用session.begin()
开启了一个事务,用于执行查询和插入操作。 -
查询数据:
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()
获取查询结果的所有记录,并以字典形式返回。
- 构建了一个查询语句,选择
-
写入数据:
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密集型的应用中,因为它允许在等待数据库响应的同时执行其他任务。