【问题标题】:Django ProgrammingError [42S02] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server] Invalid object nameDjango ProgrammingError [42S02] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server] 对象名称无效
【发布时间】:2018-08-14 16:16:13
【问题描述】:

我正在使用 Django version 2.0.2. 我的 Django 应用程序连接到 MS SQL(连接如下)。

  DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'projectcreation',
        'HOST': 'Host_name',
        'OPTIONS': {
        'driver': 'ODBC Driver 13 for SQL Server',
        'dns': 'projectcreation'
        },
}
}

所以,我在尝试访问我的 Django 应用程序时遇到以下错误:

django.db.utils.ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]无效的对象名称'projectcreation_partner'。(208) (SQLExecDirectW)")

我相信当我创建表(makemigrations+migrate)而不是创建如下所示的表时:[projectcreation].[dbo].[projectcreation_partner] 它创建了这样的表[projectcreation].[username].[projectcreation_partner]。因此,将 dbo 我实际上希望看到它放入我的用户名..

我想当应用程序尝试连接到 db 时它找不到它,因为它正在寻找一个包含 dbo 而不是用户名的.. 当然,我可能是错的..

如果您需要更多信息,请告诉我,非常感谢任何帮助。

注意:db 和 application 都称为“projectcreation”,“partner”是其中一个模型的名称。

【问题讨论】:

  • 和你的default 连接的数据库一样:如果其他没有指定,将使用默认数据库; dbo 方案是 sqlsrv 中的默认方案 - 如果未指定 other,则使用。我的意思是,您似乎正确地预测了原因。
  • @revoua 非常感谢您的回复!好的,如果我理解正确,您是在建议我输入“用户名”而不是“默认”?
  • 否,您需要在查询中指定方案或在没有方案的情况下重新填充数据(或使用 dbo 代替用户名)
  • @GileBrt 在 SQL Server 中,您可以为用户设置默认架构。在 SSMS 中,如果您转到数据库 -> [DBNAME] -> 安全 -> 用户 -> [用户名],请单击常规部分。 “默认模式”是什么意思?我将我的设置为dbo
  • @FlipperPA 感谢您对在哪里可以找到数据库用户的默认模式的评论。它帮助我修复了它。 :) 我稍后会发布解决方案。

标签: sql-server django


【解决方案1】:

我也遇到过类似的问题,这是因为一些 Django 相关的表在数据库中不可用。我已执行以下命令来解决我的问题。

python manage.py migrate

【讨论】:

    【解决方案2】:

    也可能是在你的models.py中,你有

    class tblOne(models.Model):
        col1 = ...
    
        class meta:  # This should be upper case 'M', so it should be 'class Meta'
            managed=...
            db_table='...'
    

    应该是什么时候

    class tblOne(models.Model):
        col1 = ...
    
        class Meta:
            managed=...
            db_table='...'
    

    就我而言,

    由于这个小错字,导致我的迁移文件配置错误(当我进行 makemigrations 时,迁移文件中没有写入一些模型的 manage=False 选项),因此 django 决定在一个数据库中创建一些表,但不是全部。

    因此,当 Django 开始引用错误配置的表时,Django 不确定在哪里寻找它(与您的情况类似,但在我的情况下,Django 会寻找错误配置的表 projectcreation_partner,它应该在寻找对于餐桌伙伴)。

    【讨论】:

      【解决方案3】:

      这对我有用:

      首先,我删除了属于这个“用户名”模式的所有表(先备份了数据)。

      其次,在进行迁移之前,我将 SQL Server 中的默认架构更改为“dbo”。出于某种原因,我的默认模式是以我的用户名命名的,这首先是问题的开始。要更改默认架构,请转到数据库 -> [DBNAME] -> 安全性 -> 用户 -> [用户名]。在常规下的属性中,您应该能够更改“默认架构”字段的值。

      第三,我迁移了。首先使用这个命令:

      python manage.py migrate --fake projectcreation zero
      

      请注意,“projectcreation”是我的应用程序的名称。 之后,这个命令:

      python manage.py migrate projectcreation
      

      这样做是回滚到初始迁移(零)并应用它。如果没有此回滚,数据库中就没有任何更改。

      就是这样。

      【讨论】:

      • 在我的例子中,转到数据库 -> [DBNAME] -> 安全 -> 用户 -> [用户名] 并且用户名是“dbo”。但它仍然显示下面给出的“无效对象名称”错误。 ('42S02', "[42S02] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]无效的对象名称'accounts_studentprofile'。(208) (SQLExecDirectW); [42S02] [Microsoft][ODBC Driver 13 for SQL服务器][SQL Server]无法准备语句。(8180)")
      • 在我的例子中,我有小写的“class meta:”,它应该是“class Meta:”。这导致我的迁移文件配置错误(当我执行 makemigrations 时,迁移文件中没有写入 manage=False 选项),因此 django 不确定在哪里寻找正确的表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2018-01-10
      相关资源
      最近更新 更多