You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将MariaDB生成列映射到Django,或通过迁移创建该列?

Django映射MariaDB存储型生成列的解决方案

场景1:数据库已存在生成列,映射到Django模型

如果数据库中已经创建了fiscal_number存储型生成列及索引,只需在Django模型中添加对应字段并配置参数,让ORM识别该列:

  1. 修改OperatorTaxInfo模型,添加映射字段:
from django.db import models

class OperatorTaxInfo(models.Model):
    data = models.JSONField()
    # 映射数据库已有的存储型生成列
    fiscal_number = models.CharField(
        max_length=255,
        editable=False,  # 禁止Django修改该字段,由数据库维护
        generated=True,  # 标记为数据库生成列
        db_persist=True, # 对应MariaDB的STORED类型(虚拟列设为False)
        db_column='fiscal_number' # 指定数据库列名,确保匹配
    )

    class Meta:
        db_table = 'operator_tax_info'
  1. 生成并标记迁移为已应用:
    • 生成迁移文件:python manage.py makemigrations your_app --name map_fiscal_number
    • 因为列已存在,用--fake跳过实际数据库操作:python manage.py migrate your_app --fake

完成后,即可通过模型字段直接过滤,比如OperatorTaxInfo.objects.filter(fiscal_number='XXX'),ORM会直接调用索引列,避免JSON解析的性能损耗。

场景2:通过Django迁移生成列及索引

如果需要从0开始用Django迁移创建生成列和索引,按以下步骤操作:

  1. 定义模型字段及索引:
from django.db import models

class OperatorTaxInfo(models.Model):
    data = models.JSONField()
    fiscal_number = models.CharField(
        max_length=255,
        editable=False,
        generated=True,
        db_persist=True,
        db_column='fiscal_number',
        # 指定MariaDB生成列的表达式,与原生SQL一致
        db_expression="json_unquote(json_extract(`data`,'$.fiscal_number'))"
    )

    class Meta:
        db_table = 'operator_tax_info'
        # 为生成列创建索引
        indexes = [
            models.Index(fields=['fiscal_number'], name='idx_fiscal_number')
        ]
  1. 执行迁移:
    • 生成迁移文件:python manage.py makemigrations your_app
    • 运行迁移创建列和索引:python manage.py migrate your_app

关键注意事项

  • 确保使用Django 3.2+及MariaDB 10.2+,两者对存储型生成列的支持完善。
  • 映射完成后,所有针对fiscal_number的过滤、排序操作都会直接利用数据库索引,性能与普通列一致,完全避免@property带来的全表扫描问题。
  • 不要修改fiscal_number字段的值,它由数据库自动从data字段同步维护。

内容的提问来源于stack exchange,提问作者Lmex89

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:42:50