Microsoft sql 2017 上的 Djangocms

问题描述 投票:0回答:1

Django 版本:10.11.10 Python版本:3.6.4

我将在 mssql 2017 上安装 DjangoCms,然后按照以下步骤操作

  1. 我用这个设置安装了djangocms

    DATABASES = { 
        'default': {
            'CONN_MAX_AGE': 0,
            'ENGINE': 'django.db.backends.sqlite3',
            'HOST': 'localhost',
            'NAME': 'project.db',
            'PASSWORD': '',
            'PORT': '',
            'USER': ''
        }
    }
    
  2. 确认与

    连接良好后

    python管理.py运行服务器

我修改了数据库设置:

DATABASES = {
    'default': {
        'CONN_MAX_AGE': 0,
        'ENGINE': 'sql_server.pyodbc', #sql server
        'NAME': 'myDB',
        'USER': 'userdb',
        'PASSWORD': 'passworddb',
        'HOST': '127.0.0.1',
        'PORT': '',
        'OPTIONS': {
        'driver': 'SQL Server',
        },
    },
}

然后我输入:

>python manage.py migrate
>python manage.py runserver
>python manage.py createsuperuser

我可以以超级用户身份登录,但是当我使用 cms_wizard 启动时,我收到以下消息:

/it/cms_wizard/create/

出现编程错误
Exception Value:    
('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]'substr' is not a recognized built-in function name. (195) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'AND'. (156); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)")

我不知道如何解决这个问题

sql django
1个回答
0
投票

这是针对 Django CMS 版本 4.1.4 和 SQL Server 2019 的修复,但这也可能适用于您。

编辑 CMS 的 pagemodel.py 并将其使用 substr 的位置更改为 SUBSTRING 并添加路径长度的附加参数。在 Django CMS 4.1.4 中,它位于 _remove_title_root_path 函数中。

要找到该文件: 如果您使用的是虚拟环境,请进入项目的虚拟环境文件夹 > Lib > site-packages > cms > models > pagemodel.py

变量sql_func使用substr函数作为参数,所以我将其修改为以下内容,还添加了导入,我的问题得到了解决:

from django.db.models.functions import Length
sql_func = models.Func(
                models.F('path'),
                models.Value(trim_count),
                Length('path'),
                function='SUBSTRING',
            )

发生该错误的原因是 SQL Server 没有 substr 命令,而是使用 SUBSTRING。该函数与 substr 命令相同,但多了一个“length”参数。上述调整使用动态路径长度,因此您不会遇到路径长度问题,但您可以仅输入 50 这样的静态值,而不是 Length('path')。

© www.soinside.com 2019 - 2024. All rights reserved.