版本:1.1.0b2 |发布日期:2016年7月1日

SQLAlchemy 1.1文档

反映数据库对象

可以指示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中手动构造的。

当表被反映时,如果给定的表通过外键引用另一个表,则在表示连接的MetaData对象内创建第二个Table对象。在下面,假设表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

The MetaData has an interesting “singleton-like” behavior such that if you requested both tables individually, MetaData will ensure that exactly one Table object is created for each distinct table name. 如果已经存在具有给定名称的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)

Above, my_view is a Table object with Column objects representing the names and types of each column within the view “some_view”.

通常,在反映视图时至少需要一个主键约束,如果不是外键也是如此。视图反射不会推断这些限制。

为此,使用“覆盖”技术,明确指定那些属于主键或具有外键约束的列:

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

一次反映所有表

The MetaData object can also get a listing of tables and reflect the full set. 这是通过使用reflect()方法实现的。调用它之后,所有定位的表格都存在于MetaData对象的表格字典中:

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

metadata.reflect() also provides a handy way to clear or delete all the rows in a database:

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

使用Inspector 进行细粒度反射

还提供一个低级别接口,它提供了从给定数据库加载架构,表,列和约束描述列表的后端不可知系统。这被称为“检查员”:

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)

执行数据库模式检查。

The Inspector acts as a proxy to the reflection methods of the Dialect, providing a consistent interface as well as caching support for previously fetched metadata.

通常通过inspect()函数创建Inspector对象:

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

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

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

Where above, the Dialect may opt to return an Inspector subclass that provides additional methods specific to the dialect’s target database.

__初始化__ T0> ( T1> 结合 T2> ) T3> ¶ T4>

初始化一个新的Inspector

参数:bind – a Connectable, which is typically an instance of Engine or Connection.

对于Inspector的特定于方言的实例,请参阅Inspector.from_engine()

default_schema_name T0> ¶ T1>

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

例如。对于SQL Server,这通常是Postgresql和dbopublic

classmethod from_engine(bind)

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

参数:bind – a Connectable, which is typically an instance of Engine or Connection.

此方法不同于直接构造函数调用Inspector,因为Dialect有机会提供特定于方言的Inspector实例,它可能会提供其他方法。

请参阅Inspector中的示例。

get_check_constraints table_nameschema =无** kw ) T5> ¶ T6>

table_name中返回有关检查约束的信息。

给定一个字符串table_name和一个可选字符串schema,将检查约束信息返回为带有这些键的字典列表:

名称
检查约束的名称
SQLTEXT
检查约束的SQL表达式
参数:
  • table_name – string name of the table. 对于特殊引用,请使用quoted_name
  • 架构 - 字符串架构名称;如果省略,则使用数据库连接的默认模式。对于特殊引用,请使用quoted_name

版本1.1.0中的新功能

get_columns table_nameschema =无** kw ) T5> ¶ T6>

返回有关table_name中列的信息。

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

名称
该列的名称
类型
TypeEngine
可空
布尔
默认
该列的默认值
ATTRS
包含可选列属性的字典
参数:
  • table_name – string name of the table. 对于特殊引用,请使用quoted_name
  • 架构 - 字符串架构名称;如果省略,则使用数据库连接的默认模式。对于特殊引用,请使用quoted_name
get_foreign_keys table_nameschema =无** kw ) T5> ¶ T6>

table_name中返回有关foreign_keys的信息。

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

constrained_columns
构成外键的列名称列表
referred_schema
被引用模式的名称
referred_table
被引用表的名称
referred_columns
引用表中与constrained_columns对应的列名称列表
名称
外键约束的可选名称。
参数:
  • table_name – string name of the table. 对于特殊引用,请使用quoted_name
  • 架构 - 字符串架构名称;如果省略,则使用数据库连接的默认模式。对于特殊引用,请使用quoted_name
get_indexes table_nameschema =无** kw ) T5> ¶ T6>

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

给定一个字符串table_name和一个可选字符串schema,将索引信息返回为带有这些键的字典列表:

名称
该索引的名称
COLUMN_NAMES
按列顺序排列列表
独特
布尔
dialect_options

方言特定索引选项的字典。所有方言可能不存在。

版本1.0.0中的新功能

参数:
  • table_name – string name of the table. 对于特殊引用,请使用quoted_name
  • 架构 - 字符串架构名称;如果省略,则使用数据库连接的默认模式。对于特殊引用,请使用quoted_name
get_pk_constraint table_nameschema =无** kw ) T5> ¶ T6>

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

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

constrained_columns
构成主键的列名称列表
名称
主键约束的可选名称。
参数:
  • table_name – string name of the table. 对于特殊引用,请使用quoted_name
  • 架构 - 字符串架构名称;如果省略,则使用数据库连接的默认模式。对于特殊引用,请使用quoted_name
get_primary_keys table_nameschema =无** kw ) T5> ¶ T6>

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

从版本0.7开始弃用:调用已弃用的方法get_primary_keys。改为使用get_pk_constraint。

给定一个字符串table_name和一个可选字符串schema,以列名称的形式返回主键信息。

get_schema_names T0> ( T1> ) T2> ¶ T3>

返回所有模式名称。

get_sorted_table_and_fkc_names T0> ( T1> 架构=无 T2> ) T3> ¶ T4>

返回特定模式中引用的依赖关系排序表和外键约束名称。

这将产生(tablename, [(tname, fkname), (tname, t4)的2元组> fkname), ...])由CREATE顺序中的表名组成,它们与未检测为属于周期的外键约束名称。The final element will be (None, [(tname, fkname), (tname, fkname), ..]) which will consist of remaining foreign key constraint names that would require a separate CREATE step after-the-fact, based on dependencies between tables.

1.0版本中的新功能

也可以看看

Inspector.get_table_names()

sort_tables_and_constraints() - similar method which works
与已经给出的MetaData
get_table_names(schema=None, order_by=None)

返回特定模式中引用的所有表名称。

预计这些名称只是真实的表格,而不是视图。而是使用Inspector.get_view_names()方法返回视图。

参数:
  • 架构 - 架构名称。如果schema留在None中,则使用数据库的默认模式,否则搜索指定的模式。如果数据库不支持命名模式,那么如果schema未作为None传递,则行为未定义。对于特殊引用,请使用quoted_name
  • order_by -

    可选的,可能是字符串“foreign_key”对外键依赖项的结果进行排序。不会自动解决循环,并且如果循环存在,将会引发CircularDependencyError

    从版本1.0.0开始弃用: - 请参阅Inspector.get_sorted_table_and_fkc_names(),以便自动解析表之间的外键循环。

    在版本0.8中更改:“foreign_key”排序按依赖顺序对依赖项进行排序;即按照创建顺序,而不是按降序排列。这是为了与类似的功能保持一致,例如MetaData.sorted_tablesutil.sort_tables()

get_table_options table_nameschema =无** kw ) T5> ¶ T6>

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

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

参数:
  • table_name – string name of the table. 对于特殊引用,请使用quoted_name
  • 架构 - 字符串架构名称;如果省略,则使用数据库连接的默认模式。对于特殊引用,请使用quoted_name
get_temp_table_names T0> ( T1> ) T2> ¶ T3>

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

大多数方言都不支持这种方法;目前只有SQLite实现它。

版本1.0.0中的新功能

get_temp_view_names T0> ( T1> ) T2> ¶ T3>

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

大多数方言都不支持这种方法;目前只有SQLite实现它。

版本1.0.0中的新功能

get_unique_constraints T0> ( T1> 表名 T2>,架构=无 T3>, **千瓦 T4> ) T5> ¶ T6>

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

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

名称
唯一约束的名称
COLUMN_NAMES
按列顺序排列列表
参数:
  • table_name – string name of the table. 对于特殊引用,请使用quoted_name
  • 架构 - 字符串架构名称;如果省略,则使用数据库连接的默认模式。对于特殊引用,请使用quoted_name

0.8.4版本中的新功能

get_view_definition view_nameschema =无 t5 >

返回view_name的定义。

参数:schema – Optional, retrieve names from a non-default schema. 对于特殊引用,请使用quoted_name
get_view_names T0> ( T1> 架构=无 T2> ) T3> ¶ T4>

返回schema中的所有视图名称。

参数:schema – Optional, retrieve names from a non-default schema. 对于特殊引用,请使用quoted_name
可反映 include_columnsexclude_columns =() / T5> ¶ T6>

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

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

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

engine = create_engine('...')
meta = MetaData()
user_table = Table('user', meta)
insp = Inspector.from_engine(engine)
insp.reflecttable(user_table, None)
参数:
  • table – a Table instance.
  • include_columns - 要包含在反射过程中的字符串列名称的列表。如果None,则会反映所有列。

反射的限制

需要注意的是,反射过程仅使用关系数据库中表示的信息重新创建Table元数据。按定义,此过程无法还原实际上未存储在数据库中的模式的各个方面。无法反映的国家包括但不限于:

  • 客户端默认值是Python函数或使用Columndefault关键字定义的SQL表达式(注意,这与server_default不同,具体是什么可通过反射获得)。
  • 列信息,例如可能已放入Column.info字典中的数据
  • ColumnTable.quote设置的值
  • 特定Sequence与给定Column的关联

关系数据库在很多情况下也以与SQLAlchemy中指定的格式不同的格式报告表格元数据。从反射返回的Table对象不能始终依赖于生成与原始Python定义的Table对象相同的DDL。None服务器端的默认值可以通过强制转换指令(通常Postgresql将包含一个::<type>强制转换)或不同于最初指定的引用模式返回。

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