【问题标题】:Collation Error When creating Django Database Models创建 Django 数据库模型时的排序规则错误
【发布时间】:2021-04-27 20:20:42
【问题描述】:

我已按照 philly 和其他人的各种教程使用 django-mssql-backend 设置 django,但没有运气。我认为连接正常,但是当它试图解析表时,我得到一个无法通过的排序规则错误。我正在运行的规格如下:

  • django-mssql-后端:2.8.1
  • django:3.2
  • pyodbc: 4.0.30
    'server':{
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'database',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'hostname of server',
        'PORT': '',
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'unicode_results': True,
        },
    }

当我尝试运行迁移类创建器或:

python manage.py inspectdb --database=server

我在输出中收到以下错误:

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models
# Unable to inspect table 'ADObjectMemberships'
# The error was: __new__() missing 1 required positional argument: 'collation'
# Unable to inspect table 'ADObjects'
# The error was: __new__() missing 1 required positional argument: 'collation'

我确信这是可能的,因为我在安装了 django 1.8 并安装了旧的 django-pyodbc-azure 模块的情况下使用了不同的 venv,它连接到表并提取它们的信息。我遇到的最大问题是它会在数据库中留下约 15 个表时停止,并且无论我如何修复它都会引发内存错误。

非常感谢您对此问题的任何想法或帮助!

【问题讨论】:

  • 这可能是一个错误,因为 Django 3.2 中有一个新的数据库排序规则功能,请参阅Reporting bugs 部分,如果这真的是一个错误,请先尝试询问他们的mailing list
  • 确认了你的想法,这绝对是3.2的一个bug。我今天早上删除了 3.2 并安装了 3.0(根据 pip 中 django-mssql-backend 的要求)并且没有更多的排序错误。它在运行 [python manage.py inspectdb --database=server] 时开始按预期创建数据模型。我将按照他们的程序为我发现的内容提交错误报告。感谢您的提示!

标签: sql-server django django-mssql-backend


【解决方案1】:

通过独立测试确认该问题确实是 3.2 版中的错误,并将提交错误报告。但是我现在确实提出了一种解决方法,如下所示:

  • 创建新的临时虚拟环境
  • 安装 django==3.0 pyodbc==4.0 django-mssql-backend==1.8
  • 在 settings.py 中为 SQL Server 创建数据库条目
  • 运行python manage.py inspectdb --database=yourentry > yourentry.py

一旦您为想要在您的网站中使用的现有数据库创建了所有模型,您就可以获取每个 yourentry.py 文件并将它们复制到子模型文件夹中,然后将它们导入到主 models.py 文件中。

当不再需要虚拟环境时,可以将其删除。

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 2010-11-16
    • 2012-12-03
    • 2012-03-08
    • 1970-01-01
    • 2020-09-11
    • 2012-05-04
    • 2012-11-20
    相关资源
    最近更新 更多