在postgres openerp中,table最多可以有1600列

时间:2015-04-01 09:47:39

标签: postgresql openerp-7

在我的open-erp应用程序中,我收到以下错误:

     2015-04-01 09:35:55,959 4169 ERROR new_db openerp.sql_db: bad query: ALTER TABLE "product_product" ADD COLUMN "location" VARCHAR
Traceback (most recent call last):
  File "/opt/openerp/server/openerp/sql_db.py", line 226, in execute
    res = self._obj.execute(query, params)
OperationalError: tables can have at most 1600 columns

2015-04-01 09:35:55,960 4169 ERROR new_db openerp: Failed to initialize database `new_db`.
Traceback (most recent call last):
  File "/opt/openerp/server/openerp/cli/server.py", line 97, in preload_registry
    db, registry = openerp.pooler.get_db_and_pool(dbname,update_module=update_module)
  File "/opt/openerp/server/openerp/pooler.py", line 33, in get_db_and_pool
    registry = RegistryManager.get(db_name, force_demo, status, update_module)
  File "/opt/openerp/server/openerp/modules/registry.py", line 203, in get
    update_module)
  File "/opt/openerp/server/openerp/modules/registry.py", line 233, in new
    openerp.modules.load_modules(registry.db, force_demo, status, update_module)
  File "/opt/openerp/server/openerp/modules/loading.py", line 350, in load_modules
    force, status, report, loaded_modules, update_module)
  File "/opt/openerp/server/openerp/modules/loading.py", line 256, in load_marked_modules
    loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks)
  File "/opt/openerp/server/openerp/modules/loading.py", line 165, in load_module_graph
    init_module_models(cr, package.name, models)
  File "/opt/openerp/server/openerp/modules/module.py", line 374, in init_module_models
    result = obj._auto_init(cr, {'module': module_name})
  File "/opt/openerp/server/openerp/osv/orm.py", line 3164, in _auto_init
    cr.execute('ALTER TABLE "%s" ADD COLUMN "%s" %s' % (self._table, k, get_pg_type(f)[1]))
  File "/opt/openerp/server/openerp/sql_db.py", line 161, in wrapper
    return f(self, *args, **kwargs)
  File "/opt/openerp/server/openerp/sql_db.py", line 226, in execute
    res = self._obj.execute(query, params)
OperationalError: tables can have at most 1600 columns

我从product_product表中删除了不必要的列,但仍然出现上述错误。

如何解决,请建议我。 等待回复。 感谢

3 个答案:

答案 0 :(得分:3)

我知道这可能有点晚了(也许你已经在旅行中找到了这个答案)但是在撰写本文时(2016年8月)从Postgres数据库表中删除一列实际上并没有从列中删除列表空间,它只是隐藏它,列仍然计入表空间的列限制,请参阅Postgres关于ALTER TABLE操作的文档。

  

DROP COLUMN表单没有物理删除列,只是使它对SQL操作不可见。表中的后续插入和更新操作将为列存储空值。因此,删除列是快速,但它不会立即减少表的磁盘大小,因为删除列所占用的空间不会被回收。随着现有行的更新,空间将被回收。(这些语句在删除时不适用system oid column;即时重写即可完成。)

     

来源:https://www.postgresql.org/docs/9.5/static/sql-altertable.html

因此,如果您有迁移或某些操作在表格上重复执行DROP / ADD循环,您将开始耗尽可用列,直到达到限制。

删除表并重新创建它,或者使用INSERT INTO将数据复制到新表中(尽管您必须重新创建外键等),将导致一个干净的表,而不是全部(隐藏)从以前的操作中删除列。这将有效地重置您的列数。

答案 1 :(得分:0)

这是因为ir.model.fields表中的所有列都存在,与ir.model相关的列是1。你需要从那里删除。

您还可以从用户界面中删除列。

转到Settings -> Database structure -> Models

找到你的模型并从那里删除字段。

我希望它可以帮到你。

答案 2 :(得分:0)

帮助我减少colums数量的快速修复是将数据库转储到文件,删除数据库,然后重新创建它,如下所示:

sudo su - postgres
pg_dump nameOfDatabase > backup.psql
dropdb nameOfDatabase
createdb --owner nameOfOwner nameOfDatabase
psql -d nameOfDatabase -f backup.psql
logout