带有架构的 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 1.11.7+django_pyodbc_azure-1.11.0.0+pyodbc 连接mssql 数据库