代码之家  ›  专栏  ›  技术社区  ›  Vyacheslav

django模型的数据库表的遗留引用隐藏在哪里?

  •  0
  • Vyacheslav  · 技术社区  · 6 年前

    我正在重新构造postgresql数据库:重命名表、更改外键以及将新的和修改过的表链接到django模型。但是老提到的桌子 historical_models_liveanalogvalue 还有一个古老的属性 ts 名称出现在其中一个模型中(可能在所有的模型中,但是代码退出时出现错误)。Django本地迁移是不可能的,因为一些内部原因,即使它可以防止这个问题。

    我不得不这么做 inspectdb ,基于此,修复 models.py 和执行迁移 --fake-initial 以保持项目的运行。

    在哪里可以找到并删除旧的引用?

    我用旧表名搜索字符串的所有外观,但什么也找不到。我试着用双引号将表名括起来,但也没用。 中的新模型 模型.py 具体如下:

    @architect.install('partition', type='range', subtype='date', 
    constraint='day',column='source_timestamp')
    class LiveData(models.Model):
        """The base class for live models."""
    
        # Timestamp when the sample was created.
        source_timestamp = models.DateTimeField(
            db_index=True, blank=False, null=False)
    
        class Meta:
            """Meta specification."""
            managed = False
            db_table = 'livedata'
    

    新的 0001_initial.py :

    class Migration(migrations.Migration):
    
        initial = True
    
        dependencies = [
        ]
    
        operations = [
            migrations.CreateModel(
                name='LiveData',
                fields=[('id', models.AutoField(auto_created=True, 
                primary_key=True, serialize=False, verbose_name='ID')),
                        ('source_timestamp',  models.DateTimeField(db_index=True)),
            ],
    
            options={
                'managed': False,
                'db_table': 'livedata',
            }]
    

    传统模型如下:

    @architect.install('partition', type='range', subtype='date', 
    constraint='day',
                   column='ts')
    class LiveAnalogValue(models.Model):
    """Live analogue values."""
        ts = models.DateTimeField(db_index=True, blank=False, 
        null=False)  
    

    应用程序名称为:

    historical_models        
    

    在调用时产生错误:

    model.save():
    
    One by one insertion failed for: LiveData object: invalid type name         "historical_models_liveanalogvalue."ts"%TYPE"
    LINE 3:  match historical_models_liveanalogvalue....
                                  ^
    QUERY:  
                DECLARE
                    match historical_models_liveanalogvalue."ts"%TYPE;
                    tablename VARCHAR;
                    checks TEXT;
    
                BEGIN
                    IF NEW."ts" IS NULL THEN
                        tablename :=         'historical_models_liveanalogvalue_null';
                        checks := '"ts" IS NULL';
                    ELSE
                        match := DATE_TRUNC('day', NEW."ts");
                        tablename :=     'historical_models_liveanalogvalue_' || TO_CHAR(NEW."ts", '"y"YYYY"d"DDD');
                        checks := '"ts" >= ''' || match || ''' AND "ts"     < ''' || (match + INTERVAL '1 day') || '''';
                    END IF;
    
                    IF NOT EXISTS(
                        SELECT 1 FROM information_schema.tables WHERE     table_name=tablename)
                    THEN
                        BEGIN
                            EXECUTE 'CREATE TABLE ' || tablename || ' (
                                CHECK (' || checks || '),
                                LIKE "historical_models_liveanalogvalue"            
     INCLUDING DEFAULTS INCLUDING
     CONSTRAINTS INCLUDING INDEXES
                            ) INHERITS ("historical_models_liveanalogvalue");';
                        EXCEPTION WHEN duplicate_table THEN
                            -- pass
                        END;
                    END IF;
    
                    EXECUTE 'INSERT INTO ' || tablename || ' VALUES (($1).*);' USING NEW;
                    RETURN NEW;
                END;
    
    CONTEXT:  compilation of PL/pgSQL function     
    "historical_models_liveanalogvalue_insert_child" near line 3
    

    如果我没有弄错,则在调用 model.save()

    更新:在文件夹中找到此查询 postgres/database/base/ 但仍然无法弄清楚它是如何在那里出现的。

    0 回复  |  直到 6 年前