集成数据库访问支持

DatabaseMiddleware用于在应用中提供数据库访问功能,在使用时需要依赖databases库以及连接相应数据库的异步驱动,例如PostgreSQL需要使用驱动asyncpg,MySQL需要使用驱动aiomysql

DatabaseMiddleware在配置时接受一个参数:database_url,这是一个字符串类型的值,用于提供DatabaseMiddleware数据库的连接串。数据库连接可以在之后通过request.database来获取。

Warning

这里需要注意一下,根据Starlette的开发计划,DatabaseMiddleware将在后续的版本中废除,所以建议尽量使用SQLAlchemy库或者databases库。这两个库需要在应用事件中独立完成数据库连接建立和连接关闭。

在数据库中查询可以使用以下四种方法来获取不同数量和类型的内容:

  • request.database.fetchall(query),获取全部行;
  • request.database.fetchone(query),获取一行内容;
  • request.database.fetchval(query),获取一个指定值;
  • request.database.execute(query),执行一条插入、更新、删除的查询。

对于数据库的查询可以使用SQLAlchemy Core查询或者使用原生SQL。

Warning

请勿与SQLAlchemy ORM的查询混淆,且仅能使用SQLAlchemy的经典模型定义方式。

要使用数据库事务支持,可以在Endpoint处理方法上使用@transaction来进行修饰,被修饰的方法中将自动开启和提交事务。当方法中有异常抛出的时候,事务会自动回滚。手动开启事务可以通过request.database.transaction()来获得事务实例,并通过事务实例的start()方法来启动事务,rollback()方法来回滚,commit()方法来提交事务。

除此之外,Starlette还可以与其他ORM框架一起使用,但需要在startupshutdown事件中自行控制数据库连接或连接池的开启和关闭,并且不能自动集成到Starlette的Request对象中。