如何在特定表空间中设置django与postgres数据库?

2 投票
1 回答
2374 浏览
提问于 2025-04-17 06:22

你可能会期待的内容:

settings.py

DATABASES = {
    'default': {
        'NAME': 'db_name',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'host',
        'PORT': '5432',
        'DEFAULT_TABLESPACE': 'tablespace-name',
    }
}

当我使用 DEFAULT_TABLESPACE 时,我本以为会自动使用这个默认的表空间来进行访问。但实际上,无论我在这里用什么都没关系。而且,如果我在模型的 Meta 类中明确使用 db_tablespace,似乎也没有任何效果。

我也尝试了不同的用户,但即使是 postgres 用户也不行。如果我定义 db_table = "tablespace.tablename",同样也不管用。

可以正常工作的 SQL:

select count(*) from schemaname.tablename

我备份了数据库并在本地恢复,没有创建表空间。导入时一切正常,并且忽略了表空间。然后就可以正常使用了。

我该如何配置 Django 和 postgres 的表空间?或者说 schema 名称?其实我对这些都不太懂,希望你们能帮帮我。

另见: https://docs.djangoproject.com/en/dev/topics/db/tablespaces/

使用 Django 1.3.1,postgresql 8.4,psycopg2

更新:

似乎在使用表空间时,“默认模式”没有被识别。我做了一些测试,以下是使用 ./manage.py dbshell 的结果:

在没有表空间的数据库上可以正常工作,但在有表空间的数据库上就不行:

select * from parameter;

在两个数据库上都可以正常工作的内容:

select * from tablespace.parameter;

不幸的是,数据库设置中的 "DATABASE_SCHEMA" 选项不起作用,模型的 Meta 对象中的 "db_schema" 也不行。所以问题现在变得更清楚了。有没有人有解决方案呢?

1 个回答

5

模式和表空间是两种不同的东西。

模式可以理解为一个命名空间,就像一个文件夹,用来组织和管理数据库中的对象。而表空间则是文件系统中的一个实际存储位置。模式是逻辑上的概念,而表空间则是物理上的东西。

如果你想把一堆相关的表(还有可能是其他命名的对象)放在一个命名空间里,你就需要用到模式。

如果你想通过把索引放在一个快速的SSD硬盘上来提高速度(这个硬盘和存放表、视图等的硬盘不同),那么你就需要用到表空间。

撰写回答