SqlAlchemy 2.0 中文文档(三十九)(5)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: SqlAlchemy 2.0 中文文档(三十九)

SqlAlchemy 2.0 中文文档(三十九)(4)https://developer.aliyun.com/article/1562617


参数:

  • table_name – 表的字符串名称。要进行特殊引用,请使用 quoted_name
  • schema – 模式名称的字符串;如果省略,将使用数据库连接的默认模式。要进行特殊引用,请使用 quoted_name
  • **kw – 传递给特定方言实现的额外关键字参数。有关更多信息,请参阅正在使用的方言的文档。

返回:

一个字典,包含表的注释。

自 1.2 版开始新增。

另请参阅

Inspector.get_multi_table_comment()

method get_table_names(schema: str | None = None, **kw: Any) → List[str]

返回特定模式内的所有表名称。

名称预期只是实际表,而不是视图。视图使用 Inspector.get_view_names() 和/或 Inspector.get_materialized_view_names() 方法返回。

参数:

  • schema – 模式名称。如果将 schema 留在 None,则使用数据库的默认模式,否则搜索命名模式。如果数据库不支持命名模式,则如果不将 schema 传递为 None,则行为未定义。要进行特殊引用,请使用 quoted_name
  • **kw – 传递给特定方言实现的额外关键字参数。有关更多信息,请参阅正在使用的方言的文档。

另请参阅

Inspector.get_sorted_table_and_fkc_names()

MetaData.sorted_tables

method get_table_options(table_name: str, schema: str | None = None, **kw: Any) → Dict[str, Any]

返回在创建给定名称的表时指定的选项字典。

目前包括一些适用于 MySQL 和 Oracle 表的选项。

参数:

  • table_name – 表的字符串名称。要进行特殊引用,请使用 quoted_name
  • schema – 字符串模式名称;如果省略,则使用数据库连接的默认模式。对于特殊引用,请使用quoted_name
  • **kw – 传递给方言特定实现的额外关键字参数。有关更多信息,请参阅正在使用的方言的文档。

返回:

一个带有表选项的字典。返回的键取决于正在使用的方言。每个键都以方言名称为前缀。

另请参阅

Inspector.get_multi_table_options()

method get_temp_table_names(**kw: Any) → List[str]

返回当前绑定的临时表名称列表。

大多数方言不支持此方法;目前只有 Oracle、PostgreSQL 和 SQLite 实现了它。

参数:

**kw – 传递给方言特定实现的额外关键字参数。有关更多信息,请参阅正在使用的方言的文档。

method get_temp_view_names(**kw: Any) → List[str]

返回当前绑定的临时视图名称列表。

大多数方言不支持此方法;目前只有 PostgreSQL 和 SQLite 实现了它。

参数:

**kw – 传递给方言特定实现的额外关键字参数。有关更多信息,请参阅正在使用的方言的文档。

method get_unique_constraints(table_name: str, schema: str | None = None, **kw: Any) → List[ReflectedUniqueConstraint]

返回table_name中唯一约束的信息。

给定一个字符串table_name和一个可选的字符串模式,返回ReflectedUniqueConstraint的唯一约束信息列表。

参数:

  • table_name – 表的字符串名称。对于特殊引用,请使用quoted_name
  • schema – 字符串模式名称;如果省略,则使用数据库连接的默认模式。对于特殊引用,请使用quoted_name
  • **kw – 传递给方言特定实现的额外关键字参数。有关更多信息,请参阅正在使用的方言的文档。

返回:

一个字典列表,每个代表一个唯一约束的定义。

另请参阅

Inspector.get_multi_unique_constraints()

method get_view_definition(view_name: str, schema: str | None = None, **kw: Any) → str

返回名为view_name的普通或材料化视图的定义。

参数:

  • view_name – 视图的名称。
  • schema – 可选,从非默认模式中检索名称。对于特殊引用,请使用quoted_name
  • **kw – 传递给方言特定实现的额外关键字参数。有关更多信息,请参阅正在使用的方言的文档。
method get_view_names(schema: str | None = None, **kw: Any) → List[str]

返回模式中所有非材料化视图名称。

参数:

  • schema – 可选,从非默认模式中检索名称。要进行特殊引用,请使用quoted_name
  • **kw – 额外的关键字参数,传递给特定方言实现。有关更多信息,请参阅正在使用的方言的文档。

自版本 2.0 起更改:对于以前在此列表中包括材料化视图名称的方言(目前为 PostgreSQL),此方法不再返回材料化视图的名称。应改用Inspector.get_materialized_view_names()方法。

另请参见

Inspector.get_materialized_view_names()

method has_index(table_name: str, index_name: str, schema: str | None = None, **kw: Any) → bool

检查数据库中特定索引名称的存在。

参数:

  • table_name – 索引所属的表的名称。
  • index_name – 要检查的索引的名称。
  • schema – 如果不是默认模式,则要查询的模式名称。
  • **kw – 额外的关键字参数,传递给特定方言实现。有关更多信息,请参阅正在使用的方言的文档。

自版本 2.0 起新增。

method has_schema(schema_name: str, **kw: Any) → bool

如果后端具有给定名称的模式,则返回 True。

参数:

  • schema_name – 要检查的模式的名称。
  • **kw – 额外的关键字参数,传递给特定方言实现。有关更多信息,请参阅正在使用的方言的文档。

自版本 2.0 起新增。

method has_sequence(sequence_name: str, schema: str | None = None, **kw: Any) → bool

如果后端具有给定名称的序列,则返回 True。

参数:

  • sequence_name – 序列的名称。
  • schema – 如果不是默认模式,则要查询的模式名称。
  • **kw – 额外的关键字参数,传递给特定方言实现。有关更多信息,请参阅正在使用的方言的文档。

自版本 1.4 起新增。

method has_table(table_name: str, schema: str | None = None, **kw: Any) → bool

如果后端具有给定名称的表、视图或临时表,则返回 True。

参数:

  • table_name – 要检查的表的名称。
  • schema – 如果不是默认模式,则要查询的模式名称。
  • **kw – 额外的关键字参数,传递给特定方言实现。有关更多信息,请参阅正在使用的方言的文档。

自版本 1.4 起新增:- Inspector.has_table() 方法替换了 Engine.has_table() 方法。

自版本 2.0 起更改:Inspector.has_table() 现在正式支持检查额外的类似表的对象:

  • 任何类型的视图(普通或材料化)
  • 任何类型的临时表

以前,这两个检查没有正式指定,不同的方言在行为上会有所不同。方言测试套件现在包括所有这些对象类型的测试,并应该受到所有包含在 SQLAlchemy 中的方言的支持。然而,第三方方言中的支持可能滞后。

attribute info_cache: Dict[Any, Any]
method reflect_table(table: Table, include_columns: Collection[str] | None, exclude_columns: Collection[str] = (), resolve_fks: bool = True, _extend_on: Set[Table] | None = None, _reflect_info: _ReflectionInfo | None = None) → None

给定一个Table对象,根据内省加载其内部结构。

这是大多数方言用于生成表反射的基础方法。直接使用方式如下:

from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy import inspect
engine = create_engine('...')
meta = MetaData()
user_table = Table('user', meta)
insp = inspect(engine)
insp.reflect_table(user_table, None)

从版本 1.4 开始更改:从reflecttable改名为reflect_table

参数:

  • table – 一个Table实例。
  • include_columns – 一个包含在反射过程中的字符串列名列表。如果为None,则反射所有列。
method sort_tables_on_foreign_key_dependency(consider_schemas: Collection[str | None] = (None,), **kw: Any) → List[Tuple[Tuple[str | None, str] | None, List[Tuple[Tuple[str | None, str], str | None]]]]

返回在多个模式中引用的表和外键约束名称的依赖排序。

此方法可以与Inspector.get_sorted_table_and_fkc_names()进行比较,后者一次只处理一个模式;在这里,该方法是一个通用方法,将同时考虑多个模式,包括解决跨模式外键。

2.0 版本中的新功能。

class sqlalchemy.engine.interfaces.ReflectedColumn

表示与Column对象对应的反射元素的字典。

ReflectedColumn结构由get_columns方法返回。

成员

autoincrement, comment, computed, default, dialect_options, identity, name, nullable, type

类签名

sqlalchemy.engine.interfaces.ReflectedColumn (builtins.dict)

attribute autoincrement: NotRequired[bool]

依赖于数据库的自动增量标志。

此标志指示列是否具有某种数据库端的“自动增量”标志。在 SQLAlchemy 中,其他类型的列也可能充当“自动增量”列,而不一定在其上具有这样的标志。

有关“自动增量”的更多背景信息,请参见Column.autoincrement

attribute comment: NotRequired[str | None]

如果存在,则为列的注释。只有一些方言返回此键

attribute computed: NotRequired[ReflectedComputed]

指示此列是由数据库计算的。只有一些方言返回此键。

版本 1.3.16 中的新功能:- 添加了对计算反射的支持。

attribute default: str | None

列的默认表达式作为 SQL 字符串

attribute dialect_options: NotRequired[Dict[str, Any]]

检测到的此反射对象的额外方言特定选项

attribute identity: NotRequired[ReflectedIdentity]

表示此列是一个 IDENTITY 列。只有一些方言返回此键。

版本 1.4 中的新功能:- 添加了对标识列反射的支持。

attribute name: str

列名

attribute nullable: bool

列的布尔标志,如果列是 NULL 或 NOT NULL。

attribute type: TypeEngine[Any]

作为TypeEngine实例表示的列类型。

class sqlalchemy.engine.interfaces.ReflectedComputed

表示计算列的反射元素,对应于Computed构造。

ReflectedComputed结构是ReflectedColumn结构的一部分,由Inspector.get_columns()方法返回。

成员

持久化,sqltext

类签名

sqlalchemy.engine.interfaces.ReflectedComputed (builtins.dict)

attribute persisted: NotRequired[bool]

指示值是存储在表中还是按需计算的

attribute sqltext: str

用于生成此列的表达式,以字符串 SQL 表达式返回

class sqlalchemy.engine.interfaces.ReflectedCheckConstraint

表示反映与CheckConstraint对应的元素的字典。

ReflectedCheckConstraint结构由Inspector.get_check_constraints()方法返回。

成员

方言选项,sqltext

类签名

sqlalchemy.engine.interfaces.ReflectedCheckConstraint (builtins.dict)

attribute dialect_options: NotRequired[Dict[str, Any]]

检测到的此检查约束的额外方言特定选项

版本 1.3.8 中的新功能。

attribute sqltext: str

检查约束的 SQL 表达式

class sqlalchemy.engine.interfaces.ReflectedForeignKeyConstraint

表示反映的元素的字典,对应于ForeignKeyConstraint

ReflectedForeignKeyConstraint 结构由 Inspector.get_foreign_keys() 方法返回。

成员

constrained_columns,options,referred_columns,referred_schema,referred_table

类签名

sqlalchemy.engine.interfaces.ReflectedForeignKeyConstraint (builtins.dict)

attribute constrained_columns: List[str]

组成外键的本地列名

attribute options: NotRequired[Dict[str, Any]]

检测到此外键约束的附加选项

attribute referred_columns: List[str]

引用的列名对应于constrained_columns

attribute referred_schema: str | None

被引用的表的架构名称

attribute referred_table: st

被引用的表的名称

class sqlalchemy.engine.interfaces.ReflectedIdentity

表示对应于 Identity 构造的反映的 IDENTITY 结构的列。

ReflectedIdentity 结构是 ReflectedColumn 结构的一部分,由 Inspector.get_columns() 方法返回。

成员

always,cache,cycle,increment,maxvalue,minvalue,nomaxvalue,nominvalue,on_null,order,start

类签名

sqlalchemy.engine.interfaces.ReflectedIdentitybuiltins.dict

attribute always: bool

标识列的类型

attribute cache: int | None

提前计算的序列中的未来值的数量。

attribute cycle: bool

允许在达到最大值或最小值时循环。

attribute increment: int

序列的增量值

attribute maxvalue: int

序列的最大值。

attribute minvalue: int

序列的最小值。

attribute nomaxvalue: bool

序列的最大值。

attribute nominvalue: bool

序列的最小值。

attribute on_null: bool

指示 ON NULL

attribute order: bool

如果为 true,则呈现 ORDER 关键字。

attribute start: int

序列的起始索引

class sqlalchemy.engine.interfaces.ReflectedIndex

表示与Index相对应的反射元素的字典。

ReflectedIndex结构由Inspector.get_indexes()方法返回。

成员

列名、列排序、方言选项、重复约束、表达式、包含列、名称、唯一

类签名

sqlalchemy.engine.interfaces.ReflectedIndexbuiltins.dict

attribute column_names: List[str | None]

索引引用的列名。此列表的元素如果是表达式,则为None,并在expressions列表中返回。

attribute column_sorting: NotRequired[Dict[str, Tuple[str]]]

可选字典,将列名或表达式映射到排序关键字元组,其中可能包括ascdescnulls_firstnulls_last

新版本 1.3.5 中新增。

attribute dialect_options: NotRequired[Dict[str, Any]]

此索引的附加特定方言选项

attribute duplicates_constraint: NotRequired[str | None]

表示此索引是否镜像了此名称的约束

attribute expressions: NotRequired[List[str]]

构成索引的表达式。此列表(当存在时)包含普通列名(也在column_names中)和表达式(在column_names中为None)。

attribute include_columns: NotRequired[List[str]]

包含在支持数据库的 INCLUDE 子句中的列。

自版本 2.0 开始弃用:遗留值,将被index_dict["dialect_options"]["<dialect name>_include"]替换。

attribute name: str | None

索引名称

attribute unique: bool

索引是否具有唯一标志

class sqlalchemy.engine.interfaces.ReflectedPrimaryKeyConstraint

表示与PrimaryKeyConstraint相对应的反射元素的字典。

ReflectedPrimaryKeyConstraint 结构由 Inspector.get_pk_constraint() 方法返回。

成员

constrained_columns, dialect_options

类签名

sqlalchemy.engine.interfaces.ReflectedPrimaryKeyConstraint (builtins.dict)

attribute constrained_columns: List[str]

组成主键的列名

attribute dialect_options: NotRequired[Dict[str, Any]]

检测到的此主键的附加特定方言选项

class sqlalchemy.engine.interfaces.ReflectedUniqueConstraint

字典表示对应于 UniqueConstraint 的反射元素。

ReflectedUniqueConstraint 结构由 Inspector.get_unique_constraints() 方法返回。

成员

column_names, dialect_options, duplicates_index

类签名

sqlalchemy.engine.interfaces.ReflectedUniqueConstraint (builtins.dict)

attribute column_names: List[str]

组成唯一约束的列名

attribute dialect_options: NotRequired[Dict[str, Any]]

检测到的此唯一约束的附加特定方言选项

attribute duplicates_index: NotRequired[str | None]

指示此唯一约束是否重复使用此名称的索引

class sqlalchemy.engine.interfaces.ReflectedTableComment

字典表示对应于 Table.comment 属性的反射注释。

ReflectedTableComment 结构由 Inspector.get_table_comment() 方法返回。

成员

text

类签名

sqlalchemy.engine.interfaces.ReflectedTableComment (builtins.dict)

attribute text: str | None

注释文本

使用数据库通用类型反射

当反射表的列时,无论是使用TableTable.autoload_with参数,还是使用InspectorInspector.get_columns()方法,数据类型都将尽可能地特定于目标数据库。这意味着,如果从 MySQL 数据库中反射出一个“整数”数据类型,该类型将由sqlalchemy.dialects.mysql.INTEGER类表示,其中包括 MySQL 特定的属性,如“display_width”。或者在 PostgreSQL 上,可能会返回 PostgreSQL 特定的数据类型,如sqlalchemy.dialects.postgresql.INTERVALsqlalchemy.dialects.postgresql.ENUM

有一个反射的用例,即给定一个Table要转移到另一个供应商数据库。为了适应这个用例,有一种技术,可以将这些供应商特定的数据类型即时转换为 SQLAlchemy 后端不可知的数据类型,例如上面的示例中的IntegerIntervalEnum。这可以通过拦截列反射并结合DDLEvents.column_reflect()事件和TypeEngine.as_generic()方法来实现。

给定一个 MySQL 表(选择 MySQL 是因为 MySQL 具有许多供应商特定的数据类型和选项):

CREATE  TABLE  IF  NOT  EXISTS  my_table  (
  id  INTEGER  PRIMARY  KEY  AUTO_INCREMENT,
  data1  VARCHAR(50)  CHARACTER  SET  latin1,
  data2  MEDIUMINT(4),
  data3  TINYINT(2)
)

上述表包括 MySQL 专用的整数类型MEDIUMINTTINYINT,以及一个包含 MySQL 专用CHARACTER SET选项的VARCHAR。如果我们正常地反映这个表,它将产生一个包含这些 MySQL 特定数据类型和选项的Table对象:

>>> from sqlalchemy import MetaData, Table, create_engine
>>> mysql_engine = create_engine("mysql+mysqldb://scott:tiger@localhost/test")
>>> metadata_obj = MetaData()
>>> my_mysql_table = Table("my_table", metadata_obj, autoload_with=mysql_engine)

上面的示例将上述表模式反映到一个新的 Table 对象中。然后,为了演示目的,我们可以使用 CreateTable 构造打印出特定于 MySQL 的“CREATE TABLE”语句:

>>> from sqlalchemy.schema import CreateTable
>>> print(CreateTable(my_mysql_table).compile(mysql_engine))
CREATE  TABLE  my_table  (
id  INTEGER(11)  NOT  NULL  AUTO_INCREMENT,
data1  VARCHAR(50)  CHARACTER  SET  latin1,
data2  MEDIUMINT(4),
data3  TINYINT(2),
PRIMARY  KEY  (id)
)ENGINE=InnoDB  DEFAULT  CHARSET=utf8mb4 

在上面的例子中,保留了特定于 MySQL 的数据类型和选项。如果我们想要一个可以干净地转移到另一个数据库供应商的 Table,并用 sqlalchemy.dialects.mysql.MEDIUMINTsqlalchemy.dialects.mysql.TINYINT 替换特殊数据类型,则可以选择在此表上“泛型化”数据类型,或以任何我们喜欢的方式更改它们,方法是使用 DDLEvents.column_reflect() 事件建立一个处理程序。自定义处理程序将使用 TypeEngine.as_generic() 方法,通过替换传递给事件处理程序的列字典条目中的 "type" 条目来将上述特定于 MySQL 的类型对象转换为通用类型。此字典的格式在 Inspector.get_columns() 中描述:

>>> from sqlalchemy import event
>>> metadata_obj = MetaData()
>>> @event.listens_for(metadata_obj, "column_reflect")
... def genericize_datatypes(inspector, tablename, column_dict):
...     column_dict["type"] = column_dict["type"].as_generic()
>>> my_generic_table = Table("my_table", metadata_obj, autoload_with=mysql_engine)

现在我们得到了一个新的泛型 Table 并且使用 Integer 作为这些数据类型。例如,我们现在可以在 PostgreSQL 数据库上发出“CREATE TABLE”语句:

>>> pg_engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test", echo=True)
>>> my_generic_table.create(pg_engine)
CREATE  TABLE  my_table  (
  id  SERIAL  NOT  NULL,
  data1  VARCHAR(50),
  data2  INTEGER,
  data3  INTEGER,
  PRIMARY  KEY  (id)
) 

还要注意,SQLAlchemy 通常会对其他行为做出合理的猜测,例如,MySQL 的 AUTO_INCREMENT 指令在 PostgreSQL 中最接近地表示为 SERIAL 自动增量数据类型。

1.4 版本新增了 TypeEngine.as_generic() 方法,并进一步改进了 DDLEvents.column_reflect() 事件的使用,以便可以方便地将其应用于 MetaData 对象。

反射的局限性

需要注意的是,反射过程仅使用在关系数据库中表示的信息重建Table元数据。按照定义,此过程无法恢复数据库中实际未存储的模式的方面。无法从反射中获得的状态包括但不限于:

  • 客户端默认值,可以是使用Columndefault关键字定义的 Python 函数或 SQL 表达式(注意,这与server_default是分开的,后者是通过反射获得的)。
  • 列信息,例如可能已放置在Column.info字典中的数据。
  • 对于ColumnTable.quote设置的值。
  • 将特定的Sequence与给定的Column相关联。

在许多情况下,关系数据库报告的表元数据格式与 SQLAlchemy 中指定的格式不同。从反射返回的Table对象不能始终依赖于产生与原始 Python 定义的Table对象相同的 DDL。发生这种情况的领域包括服务器默认值、与列相关联的序列以及关于约束和数据类型的各种特殊情况。服务器端默认值可能会以转换指令返回(通常情况下,PostgreSQL 会包含一个::<type>转换)或与最初指定的不同的引用模式。

另一类限制包括仅部分或尚未定义反射的模式结构。最近对反射进行的改进允许反射诸如视图、索引和外键选项之类的内容。截至撰写本文时,像检查约束、表注释和触发器之类的结构并未反射。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
关系型数据库 数据库连接 数据库
SqlAlchemy 2.0 中文文档(三十九)(1)
SqlAlchemy 2.0 中文文档(三十九)
28 0
|
2月前
|
SQL 存储 关系型数据库
SqlAlchemy 2.0 中文文档(三十四)(4)
SqlAlchemy 2.0 中文文档(三十四)
33 1
|
2月前
|
SQL 关系型数据库 数据库
SqlAlchemy 2.0 中文文档(三十四)(5)
SqlAlchemy 2.0 中文文档(三十四)
23 0
|
2月前
|
关系型数据库 MySQL 数据库
SqlAlchemy 2.0 中文文档(三十九)(3)
SqlAlchemy 2.0 中文文档(三十九)
14 0
|
2月前
|
缓存 数据库连接 数据库
SqlAlchemy 2.0 中文文档(三十九)(4)
SqlAlchemy 2.0 中文文档(三十九)
16 0
|
2月前
|
关系型数据库 数据库连接 数据库
SqlAlchemy 2.0 中文文档(三十九)(2)
SqlAlchemy 2.0 中文文档(三十九)
19 0
|
2月前
|
SQL 存储 关系型数据库
SqlAlchemy 2.0 中文文档(三十四)(1)
SqlAlchemy 2.0 中文文档(三十四)
24 0
|
2月前
|
SQL 关系型数据库 数据库
SqlAlchemy 2.0 中文文档(三十四)(3)
SqlAlchemy 2.0 中文文档(三十四)
29 0
|
2月前
|
SQL 关系型数据库 数据库
SqlAlchemy 2.0 中文文档(三十四)(2)
SqlAlchemy 2.0 中文文档(三十四)
20 0
|
2月前
|
关系型数据库 数据库连接 API
SqlAlchemy 2.0 中文文档(四十五)(3)
SqlAlchemy 2.0 中文文档(四十五)
40 0