ProgrammingError at /app-name/url-name
relation "TableName" does not exist
LINE 1: SELECT (1) AS "a" FROM "TableName" WHERE "TableName..."
我已经完成inspectdb
,确认映射与运行makemigrations
时自动设置的映射匹配,并从django_migrations表中删除了所有迁移,然后重新运行migrate
。我还通过查看django_migrations表以及运行showmigrations
来检查是否已成功导入迁移。
我想知道为什么我会在表名周围看到双引号,这就是为什么不能使用新模型的原因?有趣的是,如果我引用要在表单(而不是视图)中使用的模型,看起来确实可以正常工作,那么我会看到表单中来自数据库的正确输入。当我使用Django查询时发生错误-此查询是在同一模型“ TableName”本身中设置的,引用是否正确? (而不是从app-name.models导入TableName)
TableName.objects.using('CUSTOMDBSETTING').filter(colid='value')
请注意,当我尝试直接使用外壳程序(而不是通过Django)时,此方法有效。我也没有该表的主键,当我尝试设置非默认值(非id)时,它给了我另一个错误。
因此,当我尝试引用表映射中的主键(但不是主键)时,确实给了我错误。当我尝试删除特定ID的主键时(仅在模型中,而不在迁移中)
('42S22',“ [42S22] [Microsoft] [SQL Server的ODBC驱动程序17] [SQL 服务器]无效的列名“ id”。 (207)(SQLExecDirectW); [42S22] [Microsoft] [用于SQL Server的ODBC驱动程序17] [SQL Server]声明 无法准备。 (8180)“)
答案 0 :(得分:0)
因此,此问题的答案是,如果未在相关模型中分配特定的唯一/主键,则将应用Django中映射的默认“ id”。
也就是说,希望您的迁移具有这样的主键(模型映射不会明确显示此内容):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
...
]
要解决此问题,请使用Django的主键“ id”或设置主键-实际表并不一定要做,只需要Django模型即可。然后重新运行迁移,并确保它们适用于捕获此更改。 现在,迁移应该看起来像这样(并且不会使用“ id”键)
('tableid', models.CharField(blank=True, db_column='TableID', max_length=255, primary_key=True, serialize=False)),
或类似的东西,如果它是自动递增的
customid = models.AutoField(db_column='CustomID', null=False, primary_key=True, max_length=10)