Neutron 数据库层

本文包含一些通用的信息,对需要修改DB数据库的开发者而言有用处.

列参数 ‘default’ 和 ‘server_default’ 差异

对于列而言,可设置’default’ 或 ‘server_default’。两者之间的差别及为何使用它们?

解释非常简单:

  • default - SQLAlchemy在用于创建给定模型实例的查询中指定的默认值;
  • server_default - SQLAlchemy将在DDL中指定的列的默认值。

总结一下,“default”在迁移中是无用的,只有“server_default”应该使用。为了同步带有model的迁移,model中应添加”server_default“参数。如果不需要数据库中的默认值,不应使用“server_default”。如果通过业务逻辑强制指定“default”,声明性方法可以绕过(即模型中可省略“default”)。

数据库迁移 Database migrations

关于neutron-db-manage封装器以及Alembic迁移的详细信息,请参考OpenStack官方网站的介绍:alembic_migrations.html。

测试数据库迁移与model同步

参见模块: neutron.tests.functional.db.test_migrations

参见类: _TestModelsMigrations

标准属性表 The Standard Attribute Table

我们希望在数据库中存储许多属性,这些属性常见于许多Neutron对象中(如tags、timestamps、RBAC条目)。我们以前通过model mixins将schema复制到每个表来处理这个问题。这意味着每个使用这些通用属性的对象都需要进行数据库迁移。当属性和对象之间的关系为多对一时,这会变得更复杂,因为每个对象都需要一个这些属性的自有表(假设要考虑参考完整性)。

要解决此问题,可以使用“standardattribute”表。任何model都可以通过继承neutron.db.standard_attr中的“HasStandardAttributes” mixin来添加对此表的支持。这个mixin将为到standardattribute表有外键关联(foreign key relationship)的model添加一个名为standard_attr_id 的 BigInteger类型的列。此model将能够访问“standardattribute”表的任意列及其相关的任何表。

继承“HasStandardAttributes”的model必须实现属性“api_collections”,它是一个API资源列表,新对象可能出现在资源下。在大多数情况下,这只有一个(例如“ports”用于Port model)。这被所有添加标准属性字段的服务插件使用,以确定需要添加哪些API响应。

支持标记机制的model必须实现属性“collection_resource_map”,其是API资源使用的由“collection_name”和“resource_name”组成的字典dict。而且model必须实现属性“tag_support”,其值为True。

引入新的标准属性,对于一对一的关系只需在“standardattribute”表添加一列,而对于一对多或一对零关系要添加一个新表。然后所有使用“HasStandardAttribute” mixin的model将自动获得对新属性的访问权。

任何将应用于每个Neutron资源的属性(例如,时间戳)都可以直接添加到“standardattribute”表中。对于那些大多数条目都为空值的(例如存储错误原因的列),应在查询中添加并联接一个新表,以防止数据库中有太多的空条目。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页