如何通过Django迁移在template1数据库安装hstore扩展?
解决Django迁移时hstore类型不存在的问题
我明白你碰到的麻烦了——想通过Django自动给template1数据库安装PostgreSQL的hstore扩展,修改了0001_initial.py迁移文件后执行python manage.py migrate,还是弹出type "hstore" does not exist的错误。核心问题出在迁移的执行顺序:如果你的初始迁移里已经包含使用hstore字段的模型,Django会先尝试创建这些模型对应的表,再去执行扩展创建操作,这时候数据库还不认识hstore类型,自然就报错了。
下面是一步步的解决方案:
创建独立的前置迁移文件
先生成一个空的迁移文件,专门用来创建hstore扩展,确保它在所有用到hstore的迁移之前执行:python manage.py makemigrations --empty your_app_name把生成的文件名改成类似
0000_create_hstore_extension.py(这样Django会优先执行它,因为序号比0001小)。添加CreateExtension操作
打开这个空迁移文件,替换内容为:from django.contrib.postgres.operations import CreateExtension from django.db import migrations class Migration(migrations.Migration): # 这个迁移没有依赖,因为是最早的初始化步骤 dependencies = [] operations = [ CreateExtension('hstore'), ]执行迁移
现在先执行这个前置迁移,再执行其他迁移:python manage.py migrate your_app_name 0000_create_hstore_extension python manage.py migrate或者直接执行
python manage.py migrate,Django会自动按文件名的序号顺序执行(0000会先于0001运行)。
还有几个额外的检查点需要注意:
- 确保你的数据库用户有创建扩展的权限:可以在PostgreSQL命令行里执行
GRANT CREATE ON DATABASE template1 TO your_db_user;,开发环境也可以直接给用户超级用户权限(生产环境要谨慎操作)。 - 确认你的Django版本在1.10及以上(
CreateExtension操作是从这个版本开始引入的)。 - 确认
settings.py里的数据库引擎配置为django.db.backends.postgresql(或postgresql_psycopg2,新版Django里这两个是等价的)。
这样操作后,hstore扩展会在所有使用它的模型表创建之前被安装,就不会再出现类型不存在的错误了。
内容的提问来源于stack exchange,提问作者Kurt Peek
相关产品推荐
相关产品推荐

