目录

Demo

Github/JmilkFan/my-code-repertory/openstack

SQLAlchemy

SQLAlchemy 是 Python 下的一款开源软件。提供了 SQL对象关系映射(ORM/Object Relational Mappers)工具。使开发者可以像操作对象一般的操作数据库。

SQLAlchemy 1.1 Documentation

SQLAlchemy 1.0 Documentation

数据库的初始化

在部署 Openstack Services 的过程中需要为这些 Services 创建数据库 :

CREATE DATABASE glance;

这时我们其实仅仅是建立了数据库而已, 但是数据库中并没有表结构, 所以 Openstack Services 还提供了一条初始化(同步)数据库的指令 :

glance-manage db_sync

下面是 db_sync的代码实现方式:

# octopunch/octopunch/db/sqlalchemy/migrate_repo/versions/001_octopunch_init.py
def define_tables(meta):
vcenters = Table(
'vcenters', meta,
Column('created_at', DateTime),
Column('updated_at', DateTime),
Column('deleted_at', DateTime),
Column('uuid', String(length=45), primary_key=True),
Column('vc_value', String(length=255)),
Column('name', String(length=255)),
Column('vcs_ip', String(length=255), nullable=False),
Column('username', String(length=255), nullable=False),
Column('password', String(length=255), nullable=False),
mysql_engine='InnoDB'
)

这些 Table 的定义就是我们数据库表结构的定义, 它会在我们执行数据库初始化指令的时候被用于表的创建.

数据库的操作实现

Openstack Services 对数据库的操作一般就是对数据库中的资源表的操作, 也就是对资源的操作, 所以我们先看看 Openstack 中的资源是怎么定义的.

octopunch/octopunch/api/v1/router.py

mapper.connect() 将Resource URL & Action方法 & Controller & HTTP函数 绑定到一起, 实现HTTP请求/资源/操作函数的一一对应.

from octopunch.api.v1 import vcenter

class APIRouter(octopunch.api.openstack.APIRouter):

...

    def _setup_routes(self, mapper, ext_mgr):
self.resources['versions'] = versions.create_resource()
mapper.connect("versions", "/",
controller=self.resources['versions'],
action='show') mapper.redirect("", "/") self.resources['vcenters'] = vcenter.create_resource(ext_mgr)
mapper.resource('vcenter', 'vcenters',
controller=self.resources['vcenters'])

octopunch/octopunch/api/v1/vcenter.py

每一个 Resource 都会对应有一个 Controller 的类定义, 包含了对应的 Action 方法的实现.

class VcenterController(wsgi.Controller):
...
def index(self, req):
"""Show all vcenter list."""
context = req.environ['octopunch.context']
vcenters = self.vcenter_api.vcenter_list(context)
return {'vcenters':vcenters}
...
def create_resource(ext_mgr):
"""Vcenter resource factory method."""
return wsgi.Resource(VcenterController(ext_mgr))

octopunch/octopunch/vsphere/vcenter/api.py

在 Resource 目录下的 api.py 文件中定义对数据库的操作接口.

from octopunch.db import base

class API(base.Base):

    def vcenter_list(self, context, filters=None):
"""Get vcenter list. :param context: class:`RequestContext` instance :param filters: select data by filter.
:type: ``dict`` :return: return a list of class:`VenterInfo` instance
"""
return self.db.vcenter_get_all(context, filters)

octopunch/octopunch/db/api.py

这一层 API 接口决定使用哪种 ORM 实现和数据库类型, 而且还定义了对应 vcenter/api.py 中数据库操作接口的函数. 这样做是为了支持 Openstack 数据库的异构性. 首先需要在 octopunch/octopunch/db/base.py 中使用self.db.dispose_engine()方法让 Openstack 与数据库建立连接.

# octopunch/octopunch/db/base.py
class Base(object):
"""DB driver is injected in the init method.""" def __init__(self, db_driver=None):
# NOTE(mriedem): Without this call, multiple inheritance involving
# the db Base class does not work correctly.
super(Base, self).__init__()
if not db_driver:
db_driver = CONF.db_driver
self.db = importutils.import_module(db_driver) # pylint: disable=C0103
self.db.dispose_engine()
# octopunch/octopunch/db/api.py
from oslo_db import concurrency as db_concurrency
... # 指定使用 SQLALchemy, 并指定了 SQLAlchhemy 的接口路径
_BACKEND_MAPPING = {'sqlalchemy': 'octopunch.db.sqlalchemy.api'}
IMPL = db_concurrency.TpoolDbapiWrapper(CONF, _BACKEND_MAPPING) ...
def vcenter_get_all(context, filters=None):
"""Get the vcenter list. :param context: class:`RequestContext` instance :param filters: select data by filters.
:type: ``dict`` :return: return a list of class:`VcenterInfo` instance.
"""
return IMPL.vcenter_get_all(context, filters=filters)

octopunch/octopunch/db/sqlalchemy/api.py

这里是 SQLAlchemy 操作数据库的具体实现, EG: 查询

@require_context
def vcenter_get_all(context, filters=None):
session = get_session()
with session.begin():
vcenters_info = session.query(models.Vcenter).all()
return vcenters_info

ORM 的数据库操作方式中, 很重要一部分就是 Table Mapping Class 的实现:

# octopunch/octopunch/db/sqlalchemy/models.py
class Vcenter(BASE, OctopunchBase):
"""Represents the vcenter list.""" __tablename__ = 'vcenters'
vc_value = Column(String(255))
name = Column(String(255))
vcs_ip = Column(String(255), nullable=False)
username = Column(String(255), nullable=False)
password = Column(String(255), nullable=False) datacenters = relationship('Datacenter', backref='vcenters',
foreign_keys='Datacenter.vcenter_uuid',
primaryjoin='Vcenter.uuid =='
'Datacenter.vcenter_uuid')

将上述的 Table 定义映射为 Class之后, 我们就可以通过对 Class instance 的操作来实现对数据库 Table 的操作.

数据库的操作请求

在调试的时候我们可以在客户端通过 curl 指令来发送 HTTP 请求, 一般来说对每个 Resource 的 HTTP 请求都具有下面 5 种类型, 每一种类型都应该在 api/v1/resourceName.py 文件下(针对本文而言, 其实可以有多种实现方式)有相应的 Action 实现函数, 当然我们还可以自定义更多的实现方法.

全部查询

GET <==> show

curl -i 'http://<Service_host_ip>:<service_port>/v1/<project_id>/<ResourceUrl>' -X GET -H "Acceptn" -H "X: admin" -H "X-Auth-Token: <token_id>"

单个查询

GET <==> index

curl -i 'http://<Service_host_ip>:<service_port>/v1/<project_id>/<ResourceUrl>/<ResourceID>' -X GET -H "Acceptn" -H "X-Auth-Project-Id: admin" -H "X-Auth-Token: <token_id>"

创建

POST <==> create

curl -i 'http://<Service_host_ip>:<service_port>/v1/<project_id>/<ResourceUrl>' -X POST -H "Content-Type: application/json" -H "X-Auth-Project-Id: admin" -H "X-Auth-Token: <token_id>" -d '<body_content_dict>'

更新

PUT <==> update

curl -i 'http://<Service_host_ip>:<service_port>/v1/<project_id>/<ResourceUrl>/<ResourceID>' -X PUT -H "Content-Type: application/json" -H "X-Auth-Project-Id: admin" -H "X-Auth-Token: <token_id>" -d '<body_content_dict>'

删除

DELETE <==> delete

curl -i 'http://<Service_host_ip>:<service_port>/v1/<project_id>/<ResourceUrl>/<ResourceID>' -X DELETE -H "Acceptn" -H "X-Auth-Project-Id: admin" -H "X-Auth-Token: <token_id>"

Openstack 通过 SQLAlchemy-ORM 访问数据库的更多相关文章

  1. C++版本 ORM 访问数据库之ODB 的Window环境编译(一)

    先简单说说我为什么要编译一个ORM访问数据库的版本, 以前在做C#访问数据库时候, 直接以orm方式访问数据库, 代码写起来简单,  不用写各种复杂的sql语句, 直接有orm框架生成, 后来转到C+ ...

  2. C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)

    ODB的组成部分: 1: 操作系统的ODB编译器 2: odb核心库libodb 3: 各种数据库的相关链接库 使用ODB访问数据需要的库和头文件(不懂, 请看https://www.cnblogs. ...

  3. C++版本 ORM 访问数据库之ODB 的oracle Demo测试(二)

    有上篇文章已经说了odb的环境编译, 现在直接拿来给的例子进行数据库的增删改查操作测试 1. ODB访问oracle数据库_ 插入操作(insert) 直接运行上篇编译好的exe文件会出现如下错误 错 ...

  4. 用dotnet core搭建web服务器(三)ORM访问数据库

    访问传统sql数据库,大家以前都是用sql语句去查询.这些年流行orm方法 ORM是对象关系映射的简拼,就是用一个对象(class)去表示数据的一行,用对象的成员去表述数据的列 dotnet 官方很早 ...

  5. python3 + flask + sqlalchemy +orm(2):数据库中添加表

    往数据库中添加一张保存文章的表,表明为article,字段有id,title,content 同样一个配置文件:config.py DEBUG = True #dialect+driver://roo ...

  6. Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式

    sqlalchemy的声明层ORM访问方式 sqlalchemy中可以利用声明层进行表格类的建立,并利用ORM对象进行数据库的操作及访问,另一种方式为显式的 ORM 访问方式. 主要的建立步骤包括: ...

  7. Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式

    sqlalchemy 的显式 ORM 访问方式 对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作.还有一种访问方式为声明层 ORM 访问方式. ...

  8. 【tips】ORM - SQLAlchemy操作MySQL数据库

    优先(官方文档SQLAlchemy-version1.2): sqlalchemy | 作者:斯芬克斯 推荐一(长篇幅version1.2.0b3):python约会之ORM-sqlalchemy | ...

  9. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

随机推荐

  1. Set中如何区分重复元素

    Set接口常用实现类:HashSet和TreeSet HashSet区分重复元素: 先使用hashcode方法判断已经存在HashSet中元素的hashcode值和将要加入元素hashcode值是否相 ...

  2. vue-cli proxyTable中跨域中pathRewrite 解释

      问:proxyTable 里面的pathRewrite里面的‘^/iclient’:'' 什么意思? 答:用代理, 首先你得有一个标识, 告诉他你这个连接要用代理. 不然的话, 可能你的 html ...

  3. 十一、Boostrap-X-editable

    一.官网 http://vitalets.github.io/x-editable/index.html 二.实践 在jQuery中ajax配置项中的使用type与method的区别: type 和m ...

  4. 关于通过ip或者域名直接访问工程的问题

    1. 上篇文章 在无界面centos7上部署jdk和tomcat 里介绍了在阿里服务器上部署javaweb工程,在部署完成后,我们需要通过 ip/域名:端口 的方式访问tomcat,但是在实际项目中, ...

  5. 034-openstack中虚拟机启动后主机名设置问题

    openstack中虚拟机启动后主机名设置问题,在centos7中设置hostname后怎么都是原来的hostname,根本无效. 方法一: 在centos7中除了修改hosts文件和network文 ...

  6. GUI学习之二十四——QDialog学习总结

    今天学习对话框输入控件的基类(QDialog). 一.描述 是对话类窗口(字体框.颜色选择.文件选择框等)的基类. 对话框窗口是顶级窗口(就是说不包含于哪个父类的显示界面里),主要用于短期任务和与用户 ...

  7. flask之日志的配置

    1. 项目中,日志和配置文件都是单独在一个文件夹中,一般log文件夹和config文件夹,两个文件夹和manage.py在同一个目录下. 2. 配置日志前,先给flask装上script脚本扩展,Fl ...

  8. Spring Cloud(1)相关概念

    单点系统架构 传统项目架构 传统项目分为三层架构,将业务逻辑层.数据库访问层.控制层放入在一个项目中. 优点:适合于个人或者小团队开发,不适合大团队开发. 分布式项目架构 根据业务需求进行拆分成N个子 ...

  9. [luogu]P3941 入阵曲[前缀和][压行]

    [luogu]P3941 入阵曲 题目描述 小 F 很喜欢数学,但是到了高中以后数学总是考不好. 有一天,他在数学课上发起了呆:他想起了过去的一年.一年前,当他初识算法竞赛的 时候,觉得整个世界都焕然 ...

  10. 一本通【例题4】Addition Chains——题解

    又是一道剪枝剪了半天的搜索题...题目传送 要充分利用题目中的约束条件:1.:2.对于每个k(1≤k≤m)k(1≤k≤m)满足ak=ai+aj(0≤i,j≤k−1)ak=ai+aj(0≤i,j≤k−1 ...