create_engine
快速入门高级特性meta和engineflask_sqlalchemy.config.SQLALCHEMY_BINDSflask_sqlalchemy.config.SQLALCHEMY_ECHO反射高级自定义水平分片ShardingSQLAlchemy
快速入门
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路径中的/
标准用法是:
- 绝对路径(绝对路径区分win、linux)
- 相对路径
高级特性
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
的连接。db1
和db2
连接的URI分别为sqlite:///multi-test2.db
和sqlite:///multi-test3.db
。我们还定义了三个模型类:
User
、User1
和User2
。User
模型类使用默认连接,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,默认的有
NameMetaMixin
、BindMetaMixin
,分别添加默认的表名和默认的Bind。
水平分片Sharding
水平分片(Sharding)是一种将数据库水平划分为多个部分的技术,每个部分可以独立地扩展和管理。水平分片可以提高数据库的性能和可伸缩性,特别是在处理大量数据时。
在水平分片中,数据被分成多个分片(Shard),每个分片存储一部分数据。分片可以根据不同的规则进行划分,例如按照数据的ID、按照数据的地理位置、按照数据的时间等。每个分片都可以独立地扩展和管理,例如可以将分片部署在不同的服务器上,或者使用不同的数据库引擎来管理不同的分片。
下面是一个使用SQLAlchemy的水平分片示例代码:
在这个示例中,我们定义了一个
User
模型类,它表示用户信息,包括id
和name
两个字段。我们使用ShardedSession
来实现水平分片,每个分片使用不同的SQLite数据库来存储数据。我们定义了一个CustomSession
类,它继承自ShardedSession
,并重写了get_bind
方法,用于根据User
模型类的id
字段的值来选择分片。我们创建了两个SQLite数据库引擎
engine1
和engine2
,并使用Base.metadata.create_all
方法来创建相应的表格。我们创建了两个Session
对象Session1
和Session2
,分别绑定到engine1
和engine2
上。我们将这两个Session
对象作为字典传递给session_options
,并将CustomSession
设置为会话类。最后,我们创建了一个会话对象session
,并使用它来添加两个用户信息,并查询所有用户信息。需要注意的是,这个示例中的水平分片规则非常简单,只是根据
User
模型类的id
字段的值来选择分片。在实际应用中,水平分片的规则可能更加复杂,需要根据具体的业务需求来设计。SQLAlchemy
使用和上述的基本类似。
ORM使用
基本使用
一些注意的:
- SQLAlchemy的create_engine传入URL的相对路径中,默认从执行的脚本(python xx.py)为基准,Flask SQLAlchemy由该脚本目录的instance目录为基准。
- 注意SQL返回Result,需要在with的上下文语境中使用。
- Engine(引擎):Engine 是 SQLAlchemy 的核心组件之一,用于与数据库建立连接并执行 SQL 语句。它负责管理数据库连接池、执行 SQL 语句并处理与数据库的交互。通过 Engine,你可以执行原始的 SQL 查询和操作。
- Connection(连接):Connection 是 Engine 创建的数据库连接对象。它表示与数据库的单个连接,并提供了执行 SQL 语句和事务管理的方法。你可以使用 Connection 执行原始的 SQL 查询、插入、更新和删除操作,并手动管理事务的提交和回滚。
- Session(会话):Session 是 SQLAlchemy 提供的高级数据库交互接口,用于管理对象关系映射(ORM)。它提供了一种更高级、更抽象的方法来执行数据库操作,使得操作更容易、更直观。Session 封装了 Connection,提供了事务管理、缓存和高级查询等功能。
- MetaData(元数据):MetaData 是描述数据库结构的对象,包括表、列、约束等。它允许你定义和管理数据库模式,并在 ORM 中与对象模型进行映射。MetaData 可以通过声明式基类或手动定义表结构来创建。
- ORM(对象关系映射):ORM 是 SQLAlchemy 的核心特性之一,它允许你将数据库表和查询结果映射到 Python 对象。通过定义 ORM 模型类和映射关系,你可以使用面向对象的方式进行数据库操作,将数据库中的行和列转换为对象的属性和关系。示例见前面的使用。
- 作者:Olimi
- 链接:https://olimi.icu/article/85c1ee6e-e73d-4f54-afb8-ac2ff70472d5
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。