我正在重组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/
中找到了此查询,但仍无法弄清楚它在其中的位置。