我正在重新构造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/
但仍然无法弄清楚它是如何在那里出现的。