【问题标题】:PostgreSQL - create a generated column for a column that already existsPostgreSQL - 为已存在的列创建生成的列
【发布时间】:2021-07-27 07:29:58
【问题描述】:

我在Django 迁移文件中执行了以下原始SQL 命令。我需要使用原始的SQL,因为Django 不支持生成的列。

ALTER TABLE dockets_document ADD COLUMN search_vector tsvector GENERATED ALWAYS AS (
    setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
    setweight(to_tsvector('english', coalesce(f_arr2text(content),'')), 'B') ||
    setweight(jsonb_to_tsvector('english', coalesce(tables), '["all"]'), 'C')
) STORED;

我的models.py 文件有以下字段:

search_vector = SearchVectorField(null=True)

此行触发为我生成列的迁移,然后我的自定义迁移应用SQL。自定义迁移失败,因为该列已创建(具有相应的索引),因此 ADD COLUMN 返回错误 ERROR: column "search_vector" of relation "dockets_document" already exists。我尝试使用ALTER COLUMN 代替ADD COLUMN,但它不起作用(ERROR: syntax error at or near "tsvector")。

我尝试从 models.py 文件中删除该字段,但 Django 不知道该字段存在并且不允许我查询该列。而且感觉去掉也不对。

如何将现有的null 列转换为GENERATED 列?

【问题讨论】:

  • 如果您可以发布您的迁移文件 - 或者至少 所有 部分处理您的自定义列,也许会更容易回答这个问题。

标签: python django postgresql


【解决方案1】:

您可以执行 RunSQL 并将 state_operation 添加为 documented

state_operations 参数允许您提供以下操作: 在项目状态方面相当于 SQL。例如,如果您 正在手动创建一列,您应该传入一个包含 此处的 AddField 操作,以便自动检测器仍然具有 模型的最新状态

在手动生成empty迁移

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多