gpt4 book ai didi

django - 在 Django 中创建模型之前如何在 postgresql 中安装扩展?

转载 作者:行者123 更新时间:2023-12-04 00:07:23 25 4
gpt4 key购买 nike

使用 django 1.8 + Postgres 9+,我有带有自定义 PG 数据类型(如 ltree)的模型。从零创建数据库失败,因为

CREATE EXTENSION ltree;

不被执行。我尝试进行空迁移,但在模型创建后运行。是否存在在模型创建之前运行 sql 的方法?

最佳答案

我知道这已经很久没有答案了,也许现在您已经找到了答案。但我发帖只是以防万一有人从中得到一点帮助。

对于 Postgres 中可用的扩展

如果扩展是 Postgres 可用的默认设置之一,那么您可以简单地创建第一个迁移,然后加载其他迁移。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib.postgres.operations import HStoreExtension

from django.db import migrations


class Migration(migrations.Migration):

run_before = [
('some_app_that_requires_hstore', '0001_initial'),
]

operations = [
HStoreExtension(),
]

注意 run_before的使用.与 dependencies正好相反.或者,您可以将此迁移作为第一个迁移,然后使用 dependencies 加载所有其他迁移。 .

如果此迁移由于权限问题而无法创建扩展,那么您可以简单地使用 superusernosuperuser在 Postgres 中临时为当前用户提供运行迁移的权限,例如:
ALTER ROLE user_name superuser;
# create the extension and then remove the superuser privileges.
ALTER ROLE user_name nosuperuser;

对于 Postgres 中不可用的第三方扩展

对于第三方扩展,您可以使用 run_python,为您加载扩展,例如:
from django.db import migrations


def create_third_party_extension(apps, schema_editor):
schema_editor.execute("CREATE EXTENSION my_custom_extension;")


def drop_third_party_extension(apps, schema_editor):
schema_editor.execute("DROP EXTENSION IF EXISTS my_custom_extension;")


class Migration(migrations.Migration):

dependencies = [
('venues', '0001_auto_20180607_1014'),
]

operations = [
migrations.RunPython(create_third_party_extension, reverse_code=drop_third_party_extension, atomic=True)
]

或者,您可以将它们作为部署脚本的一部分而不是迁移。

我希望这有帮助。

关于django - 在 Django 中创建模型之前如何在 postgresql 中安装扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32619074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com