summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2017-07-10 12:35:02 +0200
committerRaphael Collet <rco@odoo.com>2017-07-10 12:38:25 +0200
commitfaacacb45fbda8cb444365dff2137ae3f56ce247 (patch)
treeb69fc5efecb5ed092586c8be809e16c2dc2d90de
parente2739d6e49db5c6d70f4dd5b0942269e88ab366a (diff)
[IMP] registry: check existence of tables with a single SQL query
-rw-r--r--odoo/modules/registry.py20
-rw-r--r--odoo/tools/sql.py7
2 files changed, 17 insertions, 10 deletions
diff --git a/odoo/modules/registry.py b/odoo/modules/registry.py
index 71d7b5d9fbe..cade92c23ac 100644
--- a/odoo/modules/registry.py
+++ b/odoo/modules/registry.py
@@ -15,9 +15,9 @@ import threading
import odoo
from .. import SUPERUSER_ID
-from odoo.tools import (assertion_report, lazy_classproperty, config,
- lazy_property, table_exists, topological_sort,
- OrderedSet, pycompat)
+from odoo.tools import (assertion_report, config, existing_tables,
+ lazy_classproperty, lazy_property, table_exists,
+ topological_sort, OrderedSet, pycompat)
from odoo.tools.lru import LRU
_logger = logging.getLogger(__name__)
@@ -310,10 +310,10 @@ class Registry(Mapping):
models[0].recompute()
# make sure all tables are present
- missing = [name
- for name, model in pycompat.items(env)
- if not model._abstract and not table_exists(cr, model._table)]
- if missing:
+ table2model = {model._table: name for name, model in env.items() if not model._abstract}
+ missing_tables = set(table2model).difference(existing_tables(cr, table2model))
+ if missing_tables:
+ missing = {table2model[table] for table in missing_tables}
_logger.warning("Models have no table: %s.", ", ".join(missing))
# recreate missing tables following model dependencies
deps = {name: model._depends for name, model in pycompat.items(env)}
@@ -322,9 +322,9 @@ class Registry(Mapping):
_logger.info("Recreate table of model %s.", name)
env[name].init()
# check again, and log errors if tables are still missing
- for name, model in pycompat.items(env):
- if not model._abstract and not table_exists(cr, model._table):
- _logger.error("Model %s has no table.", name)
+ missing_tables = set(table2model).difference(existing_tables(cr, table2model))
+ for table in missing_tables:
+ _logger.error("Model %s has no table.", table2model[table])
@lazy_property
def cache(self):
diff --git a/odoo/tools/sql.py b/odoo/tools/sql.py
index 2772d99e3e7..6c783fe27e7 100644
--- a/odoo/tools/sql.py
+++ b/odoo/tools/sql.py
@@ -21,6 +21,13 @@ _CONFDELTYPES = {
'SET DEFAULT': 'd',
}
+def existing_tables(cr, tablenames):
+ """ Return the names of existing tables among ``tablenames``. """
+ query = """ SELECT table_name FROM information_schema.tables
+ WHERE table_name IN %s AND table_schema != 'information_schema' """
+ cr.execute(query, [tuple(tablenames)])
+ return [row[0] for row in cr.fetchall()]
+
def table_exists(cr, tablename):
""" Return whether the given table exists. """
query = "SELECT 1 FROM information_schema.tables WHERE table_name=%s AND table_schema != 'information_schema'"