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

时间:2019-02-06 10:14:58

标签: python django postgresql django-models

我正在重组postgresql数据库:重命名表,更改外键并将新表和已修改表链接到django模型。但是对表historical_models_liveanalogvalue的旧引用和旧属性ts的名称出现在其中一个模型中(也许在所有模型中都存在,但是代码退出并出现错误)。由于某些内部原因,即使无法解决此问题,Django本机迁移也不可行。

我不得不做inspectdb,在此基础上,修复models.py并使用--fake-initial进行迁移,以保持项目正常运行。

还能在哪里找到和删除旧参考?

我搜索了具有旧表名称的字符串的所有外观,但找不到任何内容。我试图将表名放在双引号中,但是也没有用。 models.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

如果我没记错的话,此SQL查询会在调用model.save()时自动生成

更新:在文件夹postgres/database/base/中找到了此查询,但仍无法弄清楚它在其中的位置。

0 个答案:

没有答案