如何将表建模为sql-server需要[schema_name]。[table_name]

时间:2017-08-10 11:01:40

标签: sql-server django pyodbc

我必须使用Django FWK读取现有的SQL-SERVER数据库,并在成功连接到数据库后,当我引用 MyModel.objects.all()时,Django启动一个带有表名的查询引用,但它失败,因为SQL-Server需要前缀模式,得到错误:

('42S02', "[42S02] [Microsoft][SQL Server Native Client 11.0][SQL Server]Invalid object name 'table_name'. (208) (SQLExecDirectW)")

编辑:这只发生在非'默认'django数据库设置中。奇怪的是,我的默认数据库不需要任何特殊处理,并且是一个带有没有默认模式的db用户的sql-server数据库。

如何配置模型或settings.DATABASE或dbrouter以使django连接到特定架构而不需要使用schema_name?

选项1 :模型元类属性:db_table ='schema_name.table_name' 不起作用,因为构建的查询将FROM子句作为[schema_name.table_name],而sql需要的是[schema_name]。[table_name]

选项2 :settings.DATABASE'NAME'已经引用了schema_name,但这还不够

选项3 :不知道如何告诉django连接到特定架构或将前缀架构名称添加到它构建的所有查询中。

选项4 :make django不会用括号括起db_table。当我将db_table定义为'schema.table'时,生成的查询将使用[schema.table]包围它。没有“[]”括号查询就可以了。

2 个答案:

答案 0 :(得分:1)

Django不支持多种模式;它使用connect用户的默认架构。

但是,对于我来说,这对PostgreSQL和SQL Server来说都很有用:

db_table = 'your_schema\".\"your_table'

如果或当Django提供多种模式支持(这里多年的讨论:https://code.djangoproject.com/ticket/6148),这可能会破坏。在我的项目中,我对此感到满意,但这是应该逐项评估的,因为它没有得到官方的支持。

去年有一个PR也开始研究这个问题:https://github.com/django/django/pull/6162

祝你好运!

答案 1 :(得分:0)

这是绝对的技巧,但可以。在模型文件中,您可以包含以下内容(您希望在Django设置文件中包含DB_SCHEMA):

from django.conf import settings

DB_SCHEMA_PREFIX = ''
if settings.DB_SCHEMA and len(settings.DB_SCHEMA) > 0:
    DB_SCHEMA_PREFIX = settings.DB_SCHEMA + '].['enter code here
...
db_table = DB_SCHEMA_PREFIX + 'MyTableName'

要清楚,这不是一个很好的解决方案-框架中适当的模式支持将是首选。我可以想到的是让模式在Django中正常运行。