发布于: 2023-7-6最后更新: 2023-7-25字数 00 分钟

create_engine

快速入门

SQLAlchemy、ORM的增删改查示例代码
注意1:create_all 的使用
💡
You must be in an active Flask application context to execute queries and to access the session and engine. 您必须处于活动的 Flask 应用程序上下文中才能执行查询并访问会话和引擎。
即,如果不在flask的route响应的上下文中,比如项目启动时使用create_all。要求:
注意2:更新模型
create_all 不会更新表中的表,如果它们已经在数据库中。如果更改模型的列,请使用迁移库(如带有 Flask-Alembic 或 Flask-Migrate 的 Alembic)来生成更新数据库架构的迁移。
因此更改ORM后,考虑直接dropall然后重建。
注意3:sqlite路径中的/
标准用法是:
  1. 绝对路径(绝对路径区分win、linux)
  1. 相对路径

高级特性

meta和engine

SQLAlchemy中metadata和engine的概念和示例。
metadata是SQLAlchemy中的一种对象,它可以被用来存储表(table)、列(column)和其他相关的数据库对象的元数据。传统上,metadata对象被用来创建、修改和删除表和列。
在SQLAlchemy中,metadata对象的创建应该在创建engine对象之前。通常情况下,metadata对象和其相关的table对象一起使用,相互配合实现数据库的创建与操作。
下面是一个使用metadata对象的例子:
engine对象在SQLAlchemy中代表数据库连接。通过engine对象,我们可以执行SQL语句,注册监听器,以及拼接查询条件等。
下面是一个用engine对象创建表并执行插入操作的例子:
在上面的例子中,我们使用了engine对象创建了数据库表,并执行了插入数据操作。可以看出,metadata和engine这两个概念在SQLAlchemy中的关键作用。

flask_sqlalchemy.config.SQLALCHEMY_BINDS

flask_sqlalchemy.config.SQLALCHEMY_BINDS的配置示例
SQLALCHEMY_BINDS是Flask SQLAlchemy中的一个配置项,用于配置多个数据库连接。它是一个字典,其中每个键都是一个数据库连接的名称,对应的值是一个数据库连接的URI或配置字典。
下面是一个示例,展示如何使用SQLALCHEMY_BINDS配置多个数据库连接:
在上面的示例中,我们定义了三个数据库连接:默认连接、名为db1的连接和名为db2的连接。db1db2连接的URI分别为sqlite:///multi-test2.dbsqlite:///multi-test3.db
我们还定义了三个模型类:UserUser1User2User模型类使用默认连接,User1模型类使用db1连接,User2模型类使用db2连接。我们可以通过__bind_key__属性指定模型类使用的连接名称。
通过这样的配置,我们可以在一个Flask应用中同时连接多个数据库,并且可以方便地在不同的模型类中使用不同的数据库连接。

flask_sqlalchemy.config.SQLALCHEMY_ECHO

SQLALCHEMY_ECHO是Flask SQLAlchemy中的一个配置项,用于开启SQLAlchemy的调试模式,可以将所有的SQL语句输出到控制台,方便调试和排查问题。

反射

通过反射获得已有数据库的模型。

高级自定义

  • 自定义Model Class,作为所有模型的共同基类。
  • 抽象模型和Mixin Class,对于部分模型的共同抽象。
  • 自定义QueryClass,添加自定义的方法。
  • 自定义Model MetaClass,默认的有NameMetaMixinBindMetaMixin ,分别添加默认的表名和默认的Bind。

水平分片Sharding

水平分片(Sharding)是一种将数据库水平划分为多个部分的技术,每个部分可以独立地扩展和管理。水平分片可以提高数据库的性能和可伸缩性,特别是在处理大量数据时。
在水平分片中,数据被分成多个分片(Shard),每个分片存储一部分数据。分片可以根据不同的规则进行划分,例如按照数据的ID、按照数据的地理位置、按照数据的时间等。每个分片都可以独立地扩展和管理,例如可以将分片部署在不同的服务器上,或者使用不同的数据库引擎来管理不同的分片。
下面是一个使用SQLAlchemy的水平分片示例代码:
在这个示例中,我们定义了一个User模型类,它表示用户信息,包括idname两个字段。我们使用ShardedSession来实现水平分片,每个分片使用不同的SQLite数据库来存储数据。我们定义了一个CustomSession类,它继承自ShardedSession,并重写了get_bind方法,用于根据User模型类的id字段的值来选择分片。
我们创建了两个SQLite数据库引擎engine1engine2,并使用Base.metadata.create_all方法来创建相应的表格。我们创建了两个Session对象Session1Session2,分别绑定到engine1engine2上。我们将这两个Session对象作为字典传递给session_options,并将CustomSession设置为会话类。最后,我们创建了一个会话对象session,并使用它来添加两个用户信息,并查询所有用户信息。
需要注意的是,这个示例中的水平分片规则非常简单,只是根据User模型类的id字段的值来选择分片。在实际应用中,水平分片的规则可能更加复杂,需要根据具体的业务需求来设计。
 

SQLAlchemy

使用和上述的基本类似。
ORM使用
基本使用
一些注意的:
  • SQLAlchemy的create_engine传入URL的相对路径中,默认从执行的脚本(python xx.py)为基准,Flask SQLAlchemy由该脚本目录的instance目录为基准。
  • 注意SQL返回Result,需要在with的上下文语境中使用。
  1. Engine(引擎):Engine 是 SQLAlchemy 的核心组件之一,用于与数据库建立连接并执行 SQL 语句。它负责管理数据库连接池、执行 SQL 语句并处理与数据库的交互。通过 Engine,你可以执行原始的 SQL 查询和操作。
  1. Connection(连接):Connection 是 Engine 创建的数据库连接对象。它表示与数据库的单个连接,并提供了执行 SQL 语句和事务管理的方法。你可以使用 Connection 执行原始的 SQL 查询、插入、更新和删除操作,并手动管理事务的提交和回滚。
    1. Session(会话):Session 是 SQLAlchemy 提供的高级数据库交互接口,用于管理对象关系映射(ORM)。它提供了一种更高级、更抽象的方法来执行数据库操作,使得操作更容易、更直观。Session 封装了 Connection,提供了事务管理、缓存和高级查询等功能。
      1. MetaData(元数据):MetaData 是描述数据库结构的对象,包括表、列、约束等。它允许你定义和管理数据库模式,并在 ORM 中与对象模型进行映射。MetaData 可以通过声明式基类或手动定义表结构来创建。
        1. ORM(对象关系映射):ORM 是 SQLAlchemy 的核心特性之一,它允许你将数据库表和查询结果映射到 Python 对象。通过定义 ORM 模型类和映射关系,你可以使用面向对象的方式进行数据库操作,将数据库中的行和列转换为对象的属性和关系。示例见前面的使用。

        认证和授权
        认证和授权

        本文介绍了OAuth2.0的授权码模式和密码模式,以及PKCE的扩展。授权码模式是OAuth2.0的标准模式,密码模式不安全,PKCE是为了防止CSRF和授权代码注入攻击而设计的。本文还介绍了如何在Postman中使用PKCE。


        Python
        Python

        这篇博客介绍了Python的PEP 8规范、装饰器、执行流程和模块导入的概念。其中,模块导入的本质实现是通过sys.modules字典来访问已导入的模块,而循环导入问题可以通过将导入语句放在函数内部或通过import语句导入模块的属性来解决。