【问题标题】:Django [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'MYSCHEMA.MyUnmanagedModel'Django [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]无效的对象名称'MYSCHEMA.MyUnmanagedModel'
【发布时间】:2021-04-12 13:59:34
【问题描述】:

我遇到了这个问题:

django.db.utils.ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]无效的对象名称'MYSCHEMA.MyUnmanagedModel'。

这是一个非托管模型,所以我知道我必须提前手动创建表。

这是模型:

class MyUnmanagedModel(models.Model):
    id = models.IntegerField(db_column="ID", primary_key=True)
    end_year = models.IntegerField(db_column="endyear")
    grade = models.CharField(db_column="grade", max_length=2)
    enrollments = models.IntegerField(db_column="enrollments")

    class Meta(object):
        managed = False
        db_table = "[MYSCHEMA].[MyModelTable]"

我已确保我的 docker 数据库包含适当的“MYSCHEMA”和表“MyModelTable”,并且已根据模型(所有适当的列)适当地构建它。

我正在使用 factory-boy 来创建对象:这是我的工厂:

class MyUnmanagedModelFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = MyUnmanagedModel
        database = "secondary_database"

    id = factory.Sequence(lambda n: n)
    end_year = 2021
    grade = 1
    enrollments = 1200

我在项目中使用多个数据库,“secondary_database”是保存具有适当架构的数据库的数据库。

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": os.environ.get("default_NAME"),
        "HOST": os.environ.get("default_HOST"),
        "USER": os.environ.get("default_USER"),
        "PASSWORD": os.environ.get("default_PASSWORD"),
        "PORT": os.environ.get("default_PORT"),
        "OPTIONS": {
            "host_is_server": True,
            "driver": os.environ.get("ODBC_DRIVER"),
        },
    },
    "secondary_database": {
        "ENGINE": "mssql",
        "NAME": os.environ.get("secondary_NAME"),
        "HOST": os.environ.get("secondary_HOST"),
        "USER": os.environ.get("secondary_USER"),
        "PASSWORD": os.environ.get("secondary_PASSWORD"),
        "PORT": os.environ.get("secondary_PORT"),
        "OPTIONS": {
            "host_is_server": True,
            "driver": os.environ.get("ODBC_DRIVER"),
        },
    },

使用 DataGrip 或 Azure Data Studio,我可以连接到 secondary_database,我可以看到 MYSCHEMA 存在并且我可以确认表 'MyModelTable' 存在。

当我运行 MyUnmanagedModelFactory() 时,我看到了错误:

django.db.utils.ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'MYSCHEMA.MyModelTable'. (208) (SQLExecDirectW)")

【问题讨论】:

  • 我的猜测是您连接到错误的数据库,或者您在错误的数据库中创建了对象。
  • 我也这么认为。但是我在 factory_boy 模型中指定了数据库。所以我有点不知道在哪里/为什么会发生这种情况。
  • 出于好奇,您是否尝试过使用db_table = "MYSCHEMA].[MyModelTable"? ref: Working with SQL Server in Django pt. II 不过,这对我来说似乎是一个糟糕的解决方法。
  • 那是一篇有趣的文章——对我来说似乎有点 hacky;还不是我想尝试的修复方法。

标签: python sql-server django django-models factory-boy


【解决方案1】:

尝试将数据库连接额外“选项”设置为“-c search_path=SCHEMA_NAME”,但无效。

为每个模型设置 db_table = "SCHEMA_NAME].[TABLE_NAME" 解决了上述问题。设置正确的 SHEMA_NAME 和 TABLE_NAME 变量。

【讨论】:

    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多