反映数据库对象¶

A Table 可以指示对象从数据库中已存在的相应数据库架构对象加载有关其自身的信息。此过程称为 反射 . 在最简单的情况下,您只需要指定表名, MetaData 对象和 autoload=True 标志。如果 MetaData 不是持久绑定,也添加 autoload_with 论点:

>>> messages = Table('messages', meta, autoload=True, autoload_with=engine)
>>> [c.name for c in messages.columns]
['message_id', 'message_name', 'date']

上面的操作将使用给定的引擎查询数据库以获取有关 messages 表,然后将生成 ColumnForeignKey 以及与此信息相对应的其他对象, Table 对象是用python手工构建的。

当表被反射时,如果一个给定的表通过外键引用另一个表,则为一秒。 Table 对象是在 MetaData 表示连接的对象。下面,假设表格 shopping_cart_items 引用名为的表 shopping_carts . 反映 shopping_cart_items 表的作用是 shopping_carts 还将加载表:

>>> shopping_cart_items = Table('shopping_cart_items', meta, autoload=True, autoload_with=engine)
>>> 'shopping_carts' in meta.tables:
True

这个 MetaData 有一个有趣的“单例”行为,如果您单独请求两个表, MetaData 确保只有一个 Table 对象是为每个不同的表名创建的。这个 Table 构造函数实际上返回给您已经存在的 Table 对象(如果已存在具有给定名称的对象)。如下图所示,我们可以访问已经生成的 shopping_carts 表的名称:

shopping_carts = Table('shopping_carts', meta)

当然,这是个好主意 autoload=True 与上表无关。这样,如果尚未加载表的属性,则会加载这些属性。只有在尚未加载表时,才会对该表执行自动加载操作;加载后,新调用 Table 具有相同名称的不会重新发出任何反射查询。

覆盖反射列

在反射表时,可以用显式值覆盖各个列;这对于指定自定义数据类型、约束(如数据库中可能未配置的主键等)非常方便:

>>> mytable = Table('mytable', meta,
... Column('id', Integer, primary_key=True),   # override reflected 'id' to have primary key
... Column('mydata', Unicode(50)),    # override reflected 'mydata' to be Unicode
... autoload=True)

反射视图

反射系统也可以反射视图。基本用法与表的用法相同:

my_view = Table("some_view", metadata, autoload=True)

上面, my_view 是一个 Table 对象与 Column 对象,表示视图“某些视图”中每个列的名称和类型。

通常,在反射视图时希望至少有主键约束(如果不是外键的话)。视图反射不会推断这些约束。

为此,请使用“重写”技术,显式指定属于主键的一部分或具有外键约束的列:

my_view = Table("some_view", metadata,
                Column("view_id", Integer, primary_key=True),
                Column("related_thing", Integer, ForeignKey("othertable.thing_id")),
                autoload=True
)

同时反射所有表

这个 MetaData 对象还可以获取表列表并反映完整集。这是通过使用 reflect() 方法。调用后,所有定位的表都出现在 MetaData 对象的表字典:

meta = MetaData()
meta.reflect(bind=someengine)
users_table = meta.tables['users']
addresses_table = meta.tables['addresses']

metadata.reflect() 还提供了清除或删除数据库中所有行的简便方法:

meta = MetaData()
meta.reflect(bind=someengine)
for table in reversed(meta.sorted_tables):
    someengine.execute(table.delete())

带检查器的细颗粒反射

还提供了一个低级接口,它提供了从给定数据库加载模式、表、列和约束描述列表的后端不可知系统。这就是所谓的“检查器”::

from sqlalchemy import create_engine
from sqlalchemy.engine import reflection
engine = create_engine('...')
insp = reflection.Inspector.from_engine(engine)
print(insp.get_table_names())
class sqlalchemy.engine.reflection.Inspector(bind)

执行数据库架构检查。

检查器充当的反射方法的代理 Dialect ,为以前提取的元数据提供一致的接口和缓存支持。

A Inspector 对象通常是通过 inspect() 功能:

from sqlalchemy import inspect, create_engine
engine = create_engine('...')
insp = inspect(engine)

上述检查方法等同于使用 Inspector.from_engine() 方法,即:

engine = create_engine('...')
insp = Inspector.from_engine(engine)

在上面的地方, Dialect 可以选择返回 Inspector 提供特定于方言目标数据库的其他方法的子类。

__init__(bind)

初始化新的 Inspector .

参数

bind -- 一 Connectable ,这通常是 EngineConnection .

对于特定方言的实例 InspectorInspector.from_engine()

default_schema_name

返回当前引擎数据库用户的方言提供的默认架构名称。

例如,这通常是 public 对于PostgreSQL和 dbo 对于SQLServer。

classmethod from_engine(bind)

从给定的引擎或连接构造一个新的方言特定的检查器对象。

参数

bind -- 一 Connectable ,这通常是 EngineConnection .

此方法不同于直接调用 Inspector 在那 Dialect 有机会提供特定方言 Inspector 实例,可以提供其他方法。

参见中的示例 Inspector .

get_check_constraints(table_name, schema=None, **kw)

返回有关签入约束的信息 table_name .

给定字符串 table_name 和可选字符串 schema ,将检查约束信息作为具有以下键的dict列表返回:

名称

检查约束的名称

SqtExt

检查约束的SQL表达式

参数
  • table_name -- 表的字符串名称。对于特殊报价,使用 quoted_name .

  • schema -- 字符串架构名称;如果省略,则使用数据库连接的默认架构。对于特殊报价,使用 quoted_name .

1.1.0 新版功能.

get_columns(table_name, schema=None, **kw)

返回有关中列的信息 table_name .

给定字符串 table_name 和可选字符串 schema ,将列信息作为具有以下键的dict列表返回:

  • name -列的名称

  • type - the type of this column; an instance of TypeEngine

  • nullable -如果列为空或非空,则为布尔标志

  • default -列的服务器默认值-此值作为字符串SQL表达式返回。

  • attrs -包含可选列属性的dict

参数
  • table_name -- 表的字符串名称。对于特殊报价,使用 quoted_name .

  • schema -- 字符串架构名称;如果省略,则使用数据库连接的默认架构。对于特殊报价,使用 quoted_name .

返回

字典列表,每个字典表示数据库列的定义。

get_foreign_keys(table_name, schema=None, **kw)

返回有关中的外键的信息 table_name .

给定字符串 table_name 和可选字符串 schema ,将外键信息作为带有这些键的dict列表返回:

constrained_columns

构成外键的列名列表

referred_schema

引用的架构的名称

referred_table

引用表的名称

referred_columns

引用表中与受约束的列对应的列名称列表

名称

外键约束的可选名称。

参数
  • table_name -- 表的字符串名称。对于特殊报价,使用 quoted_name .

  • schema -- 字符串架构名称;如果省略,则使用数据库连接的默认架构。对于特殊报价,使用 quoted_name .

get_indexes(table_name, schema=None, **kw)

返回有关中索引的信息 table_name .

给定字符串 table_name 和可选字符串 schema ,将索引信息作为具有以下键的dict列表返回:

名称

索引的名称

column_names

按顺序排列的列名列表

独特的

布尔

dialect_options

方言特定索引选项的dict。可能不是所有方言都存在。

1.0.0 新版功能.

参数
  • table_name -- 表的字符串名称。对于特殊报价,使用 quoted_name .

  • schema -- 字符串架构名称;如果省略,则使用数据库连接的默认架构。对于特殊报价,使用 quoted_name .

get_pk_constraint(table_name, schema=None, **kw)

返回有关上主键约束的信息 table_name .

给定字符串 table_name 和可选字符串 schema ,将主键信息作为具有以下键的字典返回:

constrained_columns

构成主键的列名列表

名称

主键约束的可选名称。

参数
  • table_name -- 表的字符串名称。对于特殊报价,使用 quoted_name .

  • schema -- 字符串架构名称;如果省略,则使用数据库连接的默认架构。对于特殊报价,使用 quoted_name .

get_primary_keys(table_name, schema=None, **kw)

返回有关中主键的信息 table_name .

0.7 版后已移除: 这个 Inspector.get_primary_keys() 方法已弃用,将在将来的版本中删除。请参阅 Inspector.get_pk_constraint() 方法。

给定字符串 table_name 和可选字符串 schema ,返回主键信息作为列名称列表。

get_schema_names()

返回所有架构名称。

get_sorted_table_and_fkc_names(schema=None)

返回特定架构中引用的依赖项排序表和外键约束名。

这将产生2个 (tablename, [(tname, fkname), (tname, fkname), ...]) 由创建顺序中的表名组成,与未检测到属于循环的外键约束名分组。最后一个元素是 (None, [(tname, fkname), (tname, fkname), ..]) 它将由剩余的外键约束名组成,这些约束名将根据表之间的依赖关系在事实之后需要单独的创建步骤。

1.0.- 新版功能.

参见

Inspector.get_table_names()

sort_tables_and_constraints() -类似的方法

已经给出的 MetaData .

get_table_comment(table_name, schema=None, **kw)

返回有关的表注释的信息 table_name .

给定字符串 table_name 和可选字符串 schema ,将表注释信息作为带有以下键的字典返回:

文本

注释文本。

加薪 NotImplementedError 不支持评论的方言。

1.2 新版功能.

get_table_names(schema=None, order_by=None)

返回特定架构中引用的所有表名。

名称只能是实表,不能是视图。而是使用返回视图 Inspector.get_view_names() 方法。

参数
  • schema -- 架构名称。如果 schema 留在 None ,将使用数据库的默认架构,否则将搜索命名架构。如果数据库不支持命名架构,则如果 schema 不是作为 None . 对于特殊报价,使用 quoted_name .

  • order_by -- 可选,可以是字符串“foreignu key”,用于对外键依赖项的结果进行排序。不会自动解决循环,并将提升 CircularDependencyError 如果存在周期。…已弃用::1.0 get_table_names.order_by 参数已弃用,将在将来的版本中删除。请参考 Inspector.get_sorted_table_and_fkc_names() 为了更全面地解决表之间的外键循环问题。

get_table_options(table_name, schema=None, **kw)

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

这当前包括一些应用于MySQL表的选项。

参数
  • table_name -- 表的字符串名称。对于特殊报价,使用 quoted_name .

  • schema -- 字符串架构名称;如果省略,则使用数据库连接的默认架构。对于特殊报价,使用 quoted_name .

get_temp_table_names()

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

大多数方言都不支持此方法;目前只有sqlite实现它。

1.0.0 新版功能.

get_temp_view_names()

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

大多数方言都不支持此方法;目前只有sqlite实现它。

1.0.0 新版功能.

get_unique_constraints(table_name, schema=None, **kw)

返回有关中唯一约束的信息 table_name .

给定字符串 table_name 和可选字符串 schema ,返回唯一约束信息作为具有以下键的dict列表:

名称

唯一约束的名称

column_names

按顺序排列的列名列表

参数
  • table_name -- 表的字符串名称。对于特殊报价,使用 quoted_name .

  • schema -- 字符串架构名称;如果省略,则使用数据库连接的默认架构。对于特殊报价,使用 quoted_name .

get_view_definition(view_name, schema=None)

返回的定义 view_name .

参数

schema -- 可选,从非默认架构中检索名称。对于特殊报价,使用 quoted_name .

get_view_names(schema=None)

返回所有视图名称 schema .

参数

schema -- 可选,从非默认架构中检索名称。对于特殊报价,使用 quoted_name .

reflecttable(table, include_columns, exclude_columns=(), resolve_fks=True, _extend_on=None)

给定一个表对象,根据自省加载其内部构造。

这是大多数方言用来产生表反射的基本方法。直接使用如下:

from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.engine.reflection import Inspector

engine = create_engine('...')
meta = MetaData()
user_table = Table('user', meta)
insp = Inspector.from_engine(engine)
insp.reflecttable(user_table, None)
参数
  • table -- 一 Table 实例。

  • include_columns -- 要包含在反射过程中的字符串列名列表。如果 None ,将反射所有列。

反射的局限性

需要注意的是,反射过程会重新创建 Table 仅使用关系数据库中表示的信息的元数据。根据定义,此进程无法还原数据库中实际未存储的架构的各个方面。反射不可用的状态包括但不限于:

在许多情况下,关系数据库还以与SQLAlchemy中指定的格式不同的格式报告表元数据。这个 Table 从反射返回的对象不能总是依赖于生成与原始python定义的相同的ddl Table 对象。出现这种情况的区域包括服务器默认值、与列关联的序列以及有关约束和数据类型的各种特性。服务器端默认值可以用CAST指令返回(通常PostgreSQL将包括 ::<type> 或不同于最初指定的引用模式。

另一类限制包括模式结构,反射仅部分定义或尚未定义。最近对反射的改进允许反射视图、索引和外键选项等内容。在撰写本文时,检查约束、表注释和触发器等结构不会反映出来。