带有架构的 MSSQL 数据库的 Django 迁移错误

Posted

技术标签:

【中文标题】带有架构的 MSSQL 数据库的 Django 迁移错误【英文标题】:Django Migration Error With MSSQL Database With Schemas 【发布时间】:2021-01-23 15:34:00 【问题描述】:

我刚刚开始为 Django 后端创建设置(全部在 Python 中)。我使用 MS SQL 并在 Linux 中运行我的 django 以连接到 MSSQL。设置数据库规范后,我遇到以下错误。

鉴于我的数据库有多个模式,我假设我必须告诉 django 在数据库中使用哪个模式,但我找不到正确的位置。

有什么想法吗?

我的设置:

DATABASES = 
    'default': 
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'MyDB',
        'HOST': '********',
        'PASSWORD': '**************',
        'AUTOCOMMIT': True,
        'USER': 'root',
        'OPTIONS': 
            'driver': 'ODBC Driver 17 for SQL Server',
            ,
    ,
```

Error:

```django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table (('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Hello there. It looks like you're trying to create an object without specifying a schema name. Please create in a named schema, eg schemaname.tablename\r\n\t (50000) (SQLExecDirectW)"))```

【问题讨论】:

【参考方案1】:

在您的代码中尝试 'NAME': schema name 而不是 'MyDB'。

但是,我没有使用过 MSSQL,如果是 mysql,我只提到了模式名称。我相信一旦您指定了“主机”和“端口”,它应该连接到数据库。设置应如下所示:(希望有帮助)

DATABASES = 
'default': 
    'ENGINE': 'sql_server.pyodbc',
    'HOST': '***********', # example 'dbserver.your-domain.com'
    'PORT': 'XXXX',
    'NAME': 'schema name',
    'USER': 'root', # always better to use project specific user
    'PASSWORD': '************',
    'OPTIONS': 
        'driver': 'ODBC Driver 17 for SQL Server',
    ,
,

【讨论】:

所以这意味着我应该写 MyDB.MySchema?我以前试过这个,它会超时连接到 sql,因为它无法识别数据库名称。但是 MyDB 是 django 可以连接的有效名称,但无法在里面写入表,因为它不了解里面的模式(有多个) 我尝试使用 django-db-prefix 并将 DB_PRE = 'xxx].[' 放入设置中。我在 webworks 上找到的这个技巧可以很好地添加模式。现在它可以为 django_migrations 表创建表了。但它未能创建内容类型表,因为此技巧在其迁移文件夹中的 0001_initial.py 中不起作用。我真的不知道它是怎么解决的...... 正在应用 contenttypes.0001_initial...Traceback(最近一次调用最后一次):pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server ]'.' 附近的语法不正确。(102) (SQLExecDirectW)")【参考方案2】:

我遇到了同样的问题,解决方案是创建一个新的数据库用户,并将默认架构设置为您打算使用的架构。然后在您的 settings.py 中使用新的数据库用户和登录详细信息

CREATE LOGIN djangoLogin WITH password='XXXXXXXXXXX';

CREATE USER djangoUser FROM LOGIN djangoLogin WITH DEFAULT_SCHEMA = yourSchema;

EXEC sp_addrolemember 'db_owner', 'djangoUser';

DATABASES = 
'default': 
    'ENGINE': 'sql_server.pyodbc',
    'HOST': '***********', # example 'dbserver.your-domain.com'
    'PORT': 'XXXX',
    'NAME': 'database name',
    'USER': 'djangoLogin',
    'PASSWORD': '************',
    'OPTIONS': 
        'driver': 'ODBC Driver 17 for SQL Server',
    ,
,

【讨论】:

以上是关于带有架构的 MSSQL 数据库的 Django 迁移错误的主要内容,如果未能解决你的问题,请参考以下文章

django 模型创建连接到 mssql

防止 Django 更新 MSSQL 中的标识列

富士通株式会:重点发展云基础架构 现阶段不能完全将工厂迁至中国

从 Django 网页中的 MSSQL 数据库中获取搜索结果

Django 1.11.7+django_pyodbc_azure-1.11.0.0+pyodbc 连接mssql 数据库

如何更改 MSSQL 中所有表、视图和存储过程的架构