Jump to: navigation, search

Main Page/cobbler

sqlalchemy和sqlalchemy-migrate在openstack的应用介绍

sqlalchemy 简介: 提供ORM(对象关系映射)能力的python库,类似hibernate技术,支持postgresql、mysql等主流关系数据;用户只需定义DB对应的类,通过操作类实例,即可通过sqlalchemy引擎转换成标准sql语句,对DB进行操作

Openstack中的应用: openstack各项目涉及关系数据库的DB driver,基本都是使用sqlalchemy库。 table对应class定义:\nova\db\sqlalchemy\models.py中,例如class Instance(BASE, NovaBase) db操作API:\nova\db\sqlalchemy\api.py,调用sqlalchemy相关库函数操作DB,数据实体使用models.py定义的class

sqlalchemy-migrate 简介: 基于sqlalchemy库,提供数据库版本管控能力的python库。

Openstack中的应用: 版本升级能力是openstack当前能力较缺失的一块,但是从DB升级的角度看,由于引入了sqlalchemy-migrate框架,openstack各项目比较容易管理DB的变化,例如新增加一张table,新增加一个字段等。 sqlalchemy-migrate在2011年发布了0.7.2版本后,就已经停止更新了,也不接受bugfix。因此openstack考虑引入Alembic(同样由sqlalchemy-migrate的开发者)替代sqlalchemy-migrate sqlalchemy-migrate提供upgrade(升级)、downgrade(降级)、db_version(查看最新版本)等接口

应用举例: 在H版本代码基础上nova项目提供USB设备管理能力,故在DB Layper需增加一张table存放USB设备信息。

1. 在/nova/db/sqlalchemy/migrate_repo/versions增加一个217_add_usb_devices.py(H版本version号到216,故新增文件命令以217开头)

  1. 定义升级函数,本例升级即创建一张新table

def upgrade(migrate_engine):

   meta = MetaData(bind=migrate_engine)
   usb_devices_uc_name = 'uniq_usb_devices0compute_node_id0address0deleted'
   usb_devices = Table('usb_devices', meta,
                       Column('created_at', DateTime(timezone=False)),
                       ...
  1. 定义升级回退函数,本例回退即删除创建的table

def downgrade(migrate_engine):

   meta = MetaData(bind=migrate_engine)
   try:
       usb_device = Table('usb_devices', meta, autoload=True)
       usb_device.drop()
       ...

2. 执行nova-manage db sync命令,对nova DB进行升级。结果是在数据库中即可见到产生的usb_devices表 3. 执行nova-manage db sync 216命令,对nova DB进行升级。结果是usb_devices表被删除

系统内部流程简介: (1)在DB的migrate_version中存放了nova的DB版本信息,如下所示: mysql> select * from migrate_version; +---------------+------------------------------------------------------------------+---------+ | repository_id | repository_path | version | +---------------+------------------------------------------------------------------+---------+ | nova | /usr/lib/python2.6/site-packages/nova/db/sqlalchemy/migrate_repo | 216 | +---------------+------------------------------------------------------------------+---------+ 1 row in set (0.00 sec) (2)执行nova-manage db sync命令,调用/nova/db/sqlalchemy/migration.py的db_sync函数

        此函数检查当前版本号和API传入的版本号,如果API不指定版本号(见上面例子)、或者指定的版本号大于当前版本号,则进入升级流程,否则进入降级流程

(3)最终进入migrate/versioning/api.py的_migrate函数

        此函数检查是否有变更点,如果没有变更点则结束流程,如果有变更点(例如上例新增加了217_xx),则执行变更(即执行217_add_usb_devices.py中的upgrade函数),产生新DB

相关参考: http://blog.csdn.net/tpiperatgod/article/details/17560005 http://www.sqlalchemy.org/ http://www.cnblogs.com/willier/archive/2013/05/16/3081475.html http://www.ustack.com/blog/sqlalchemy-migrate-and-alembic/