Odoo的启动通过openerp-server脚本完成,它是系统的入口。

然后加载配置文件openerp-server.conf 或者 openerp_serverrc;

openerp-server.conf的主要内容:

这个文件缺省是没有的,Odoo系统会有一个默认值,但是一般情况我们都需配置这个文件。

启动http服务器,监听端口。

模块加载:

模块加载外层就是封装一个Registry(Mapping)对象:实际是一个字典,它包含对应的db,model等映射关系,一个DB对应一个Registry。后续的操作都会围绕这个Registry进行,将相关的数据赋值给相应的属性项。

1. 初始化数据库(初次运行)
1)加载base模块下的base.sql文件并执行。
此时数据库表为:

CREATE TABLE ir_actions (
id serial,
primary key(id)
);
CREATE TABLE ir_act_window (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_report_xml (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_url (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_server (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_client (primary key(id)) INHERITS (ir_actions); CREATE TABLE ir_model (
id serial,
model varchar NOT NULL,
name varchar,
state varchar,
info text,
primary key(id)
); CREATE TABLE ir_model_fields (
id serial,
model varchar NOT NULL,
model_id integer references ir_model on delete cascade,
name varchar NOT NULL,
relation varchar,
select_level varchar,
field_description varchar,
ttype varchar,
state varchar default 'base',
relation_field varchar,
translate boolean default False,
serialization_field_id integer references ir_model_fields on delete cascade,
primary key(id)
); CREATE TABLE res_lang (
id serial,
name VARCHAR(64) NOT NULL UNIQUE,
code VARCHAR(16) NOT NULL UNIQUE,
primary key(id)
); CREATE TABLE res_users (
id serial NOT NULL,
active boolean default True,
login varchar(64) NOT NULL UNIQUE,
password varchar(64) default null,
-- No FK references below, will be added later by ORM
-- (when the destination rows exist)
company_id integer, -- references res_company,
partner_id integer, -- references res_partner,
primary key(id)
); create table wkf (
id serial,
name varchar(64),
osv varchar(64),
on_create bool default false,
primary key(id)
); CREATE TABLE ir_module_category (
id serial NOT NULL,
create_uid integer, -- references res_users on delete set null,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer, -- references res_users on delete set null,
parent_id integer REFERENCES ir_module_category ON DELETE SET NULL,
name character varying(128) NOT NULL,
primary key(id)
); CREATE TABLE ir_module_module (
id serial NOT NULL,
create_uid integer, -- references res_users on delete set null,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer, -- references res_users on delete set null,
website character varying(256),
summary character varying(256),
name character varying(128) NOT NULL,
author character varying(128),
icon varchar,
state character varying(16),
latest_version character varying(64),
shortdesc character varying(256),
category_id integer REFERENCES ir_module_category ON DELETE SET NULL,
description text,
application boolean default False,
demo boolean default False,
web boolean DEFAULT FALSE,
license character varying(32),
sequence integer DEFAULT 100,
auto_install boolean default False,
primary key(id)
);
ALTER TABLE ir_module_module add constraint name_uniq unique (name); CREATE TABLE ir_module_module_dependency (
id serial NOT NULL,
create_uid integer, -- references res_users on delete set null,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer, -- references res_users on delete set null,
name character varying(128),
module_id integer REFERENCES ir_module_module ON DELETE cascade,
primary key(id)
); CREATE TABLE ir_model_data (
id serial NOT NULL,
create_uid integer,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer,
noupdate boolean,
name varchar NOT NULL,
date_init timestamp without time zone,
date_update timestamp without time zone,
module varchar NOT NULL,
model varchar NOT NULL,
res_id integer,
primary key(id)
); -- Records foreign keys and constraints installed by a module (so they can be
-- removed when the module is uninstalled):
-- - for a foreign key: type is 'f',
-- - for a constraint: type is 'u' (this is the convention PostgreSQL uses).
CREATE TABLE ir_model_constraint (
id serial NOT NULL,
date_init timestamp without time zone,
date_update timestamp without time zone,
module integer NOT NULL references ir_module_module on delete restrict,
model integer NOT NULL references ir_model on delete restrict,
type character varying(1) NOT NULL,
name varchar NOT NULL,
primary key(id)
); -- Records relation tables (i.e. implementing many2many) installed by a module
-- (so they can be removed when the module is uninstalled).
CREATE TABLE ir_model_relation (
id serial NOT NULL,
date_init timestamp without time zone,
date_update timestamp without time zone,
module integer NOT NULL references ir_module_module on delete restrict,
model integer NOT NULL references ir_model on delete restrict,
name varchar NOT NULL,
primary key(id)
); CREATE TABLE res_currency (
id serial,
name varchar NOT NULL,
primary key(id)
); CREATE TABLE res_company (
id serial,
name varchar NOT NULL,
partner_id integer,
currency_id integer,
primary key(id)
); CREATE TABLE res_partner (
id serial,
name varchar,
company_id integer,
primary key(id)
);

这20张表是odoo系统级的,它是模块加载及系统运行的基础。后续模块生成的表及相关数据都可以在这20张中找到蛛丝马迹。

2)数据库表初始化后,就可以加载模块数据(addons)到数据库了,这个也是odoo作为平台灵活的原因,所有的数据都在数据库。
找到addons-path下所有的模块,然后一个一个的加载到数据库中。
Info就是load模块的__openerp__.py文件,它是一个dict。

根据__openerp__.py中定义的category创建分类信息:
将模块信息写入ir_module_module表:
将module信息写入ir_model_data表:
一个module要写两次ir_model_data表,
写module的dependency表:

根据依赖关系进行判断,递归更新那些需要auto_install的模块状态为“to install”。

到目前为止,模块的加载都是在数据库级别,只是将“模块文件”信息存入数据库表,但是还没有真正加载到程序中。
Odoo运行时查找object是通过Registry.get()获取的,而不是通过python自己的机制来找到相应的object,所以odoo在加载模块时会把模块下包含的model全部注册到models.py的module_to_models字典中。

下面的步骤就是加载模块到内存:
3)加载base模块
创建一个包含model层级的节点图,第二行代码将从数据库更新数据到graph中。然后调用load_module_graph方法加载模块,最终执行加载的方法:
这个方法是odoo加载model的核心,通过 __import__方法加载模块,这个是python的机制,当import到某个继承了BaseModel类的class时,它的实例化将有别于python自身的实例化操作,
后者说它根本不会通过python自身的__new__方法创建实例,所有的实例创建都是通过 _build_model 方法及元类创建,并注册到module_to_models中。通过这种方式实例化model就可以解决我们在xml中配置model时指定的继承,字段,约束等各种属性。

4)标记需要加载或者更新的模块(db)
5)加载被标记的模块(加载过程与加载base模块一致)
6)完成及清理安装
7)清理菜单
8)删除卸载的模块
9)核实model的view
10)运行post-install测试

Odoo加载机制指导流程的更多相关文章

  1. (14)odoo加载机制

    Odoo的启动通过openerp-server脚本完成,它是系统的入口. 然后加载配置文件openerp-server.conf 或者 .openerp_serverrc: openerp-serve ...

  2. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  3. 从代码分析Android-Universal-Image-Loader的图片加载、显示流程

    从UNIVERSAL IMAGE LOADER. PART 3(四个DisplayImage重载方法详解)中,我们学习了Android-Universal-Image-Loader(以下简称UIL)中 ...

  4. 图解classloader加载class的流程及自定义ClassLoader

    图解classloader加载class的流程及自定义ClassLoader 博客分类: JVM JavaJVM虚拟机EXTSUN /** *  转载请注明作者longdick    http://l ...

  5. java加载机制整理

    本文是根据李刚的<疯狂讲义>作的笔记,程序有的地方做了修改,特别是路径,一直在混淆,浪费了好多时间!!希望懂的同学能够指导本人,感激尽............ 1.jvm 和 类的关系 当 ...

  6. 浅析dex文件加载机制

    我们可以利用DexClassLoader来实现动态加载dex文件,而很多资料也只是对于DexClassLoader的使用进行了介绍,没有深入讲解dex的动态加载机制,我们就借助于Android4.4的 ...

  7. 深入java虚拟机学习 -- 类的加载机制

    当看到"类的加载机制",肯定很多人都在想我平时也不接触啊,工作中无非就是写代码,不会了可以百度,至于类,jvm是怎么加载的我一点也不需要关心.在我刚开始工作的时候也觉得这些底层的内 ...

  8. JVM-01:类的加载机制

    本文从 纯洁的微笑的博客 转载 原地址:http://www.ityouknow.com/jvm.html 类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...

  9. Android 的 so 文件加载机制

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 最近碰到一些 so 文件问题,顺便将相关知识点梳理一下. 提问 本文的结论是跟着 System.loadlibrary() 一层层源 ...

随机推荐

  1. Mysql ---部署,创建用户

    版本:mysql-5.7.18-win32 步骤: 1 准备my.ini文件放在bin同级目录 My.ini文件可以设置bsedir/datadir/port等等 2 初始化数据库(5.7版本需要初始 ...

  2. C/C++ Microsoft Visual Studio c++ DOC Home

    { // https://docs.microsoft.com/zh-cn/cpp/overview/visual-cpp-in-visual-studio?view=vs-2017 // https ...

  3. 2428: [HAOI2006]均分数据

    模拟退火.一种十分玄学的随机算法,网上可以查到比较详细的资料. 先随机地把数分成m组,每次随机地选择一个数,一开始直接选最小的一组,后来就随机一组,把这个数换到该组看看答案能不能变小,如果变小则换,如 ...

  4. 资源-Java:Java资源列表

    ylbtech-资源-Java:Java资源列表 1. 开发软件返回顶部 1.Eclipse https://www.eclipse.org/ 2.IntelliJ IDEA https://www. ...

  5. MongoDB后台运行

    文章目录 命令方式(推荐) 命令行和配置文件方式 命令行: 配置文件: 命令方式(推荐) 如果想在后台运行,启动时只需添加 --fork函数即可. fork: 以守护进程的方式运行MongoDB. 指 ...

  6. winform程序捕获全局异常,对错误信息写入日志并弹窗

    使用场景:在winform程序中如果没对方法进行try catch操作,若方法内出错,则整个程序报错并退出,如下图 如果程序已在客户手中,若没对错误的详细信息进行拍照,我们则不知道错误原因是什么.我们 ...

  7. SQL语句的四种连接

    SQL的四种连接查询 内连接 inner join 或者 join 外连接 左连接   left join 或者 left outer join 右连接  right join 或者 right ou ...

  8. Eclipse 中安装 CDT 插件编写 C/C++

    使用到的软件 1.Eclipse 开发工具 2.MinGW 编译器 一.Eclipse 中安装 CDT 插件 打开 Eclipse 插件市场 搜索 CDT,并找到如下的插件.插件的版本名字可能不太一样 ...

  9. 【默默努力】h5-game-heroVSmonster

    先放下作者大大的项目地址:https://github.com/yangyunhe369/h5-game-heroVSmonster 然后游戏的效果为 截动图的按键与游戏按键应该冲突,我就截几张图片了 ...

  10. day1-字符串、列表

    字符串操作: name = "Wills Qian" # 创建字符串变量 print(len(name)) # 打印字符串长度 print(name[0]) # 提取第一个字符W ...