【发布时间】: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