有关故障排除的建议 Wagtail/SQL 需要 Azure 兼容性

Advice on troubleshooting Wagtail/SQL Azure compatibility required

我的组织正在开发一个基于 Wagtail 作为 CMS 后端的新发布平台。我们在 MS SQL 数据库方面拥有广泛的内部专业知识,但仅次于 none 和 Postgres 或 MySQL,因此更愿意使用 MS SQL(特别是 SQL Azure) - Wagtail 的文档似乎暗示这是可能的。

我有一个 Wagtail 运行ning 实例,并安装了声称支持 SQL Azure 的 Django 后端 (https://pypi.python.org/pypi/django-pyodbc-azure)。我已经在 settings.py.

中配置了我的数据库连接设置

我可以成功 运行 迁移并创建超级用户,因此我有理由相信数据库连接良好。

然后我可以在 http://localhost:8000/admin 浏览到 Wagtail 登录页面,但是在使用提供给 createsuperuser 脚本的凭据登录后,我立即收到以下错误:

('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'LIMIT'. (102) (SQLExecDirectW)")

Wagtail 本身似乎正在使用 MS 不支持的 LIMIT 关键字 SQL - 我排除故障并尝试解决此行为的最佳方法是什么?还是我在隐瞒什么?

冒犯 SQL :

SELECT wp.* FROM wagtailcore_pagerevision wp
JOIN ( SELECT max(created_at) AS max_created_at,
page_id FROM wagtailcore_pagerevision WHERE user_id = %s 
GROUP BY page_id ORDER BY max_created_at DESC LIMIT %s ) AS max_rev ON max_rev.max_created_at = wp.created_at ORDER BY wp.created_at DESC

在大多数情况下,Wagtail 使用支持 MS SQL 的 Django 的 ORM。在某些情况下,我们会掉入 'raw' SQL,通常是出于性能原因。在这种情况下,原始 SQL 与 MS SQL 不兼容,正如您所指出的。您可以采用两种方法来解决此问题:

  1. 重构代码以使用 Django ORM(检查任何性能影响)

  2. 为 MS SQL 提供一个特例,例如

https://github.com/wagtail/wagtail/blob/da067679cdd7999c256c8916f78c82f7641d51cd/wagtail/wagtailcore/models.py#L602

感谢大家的回复。

我们最终设法通过破解 SQL 的尴尬位来让事情正常运行,并发现它是唯一导致任何问题的东西(所以这是个好消息!)

我也升级到 1.9,没有发现任何其他问题,所以看起来不错。

我们的修改是

        last_edits = PageRevision.objects.raw(
        """
        SELECT wp.* FROM
            wagtailcore_pagerevision wp JOIN (
                SELECT TOP 5 max(created_at) AS max_created_at, page_id FROM
                    wagtailcore_pagerevision WHERE user_id = %s GROUP BY page_id ORDER BY max_created_at DESC
            ) AS max_rev ON max_rev.max_created_at = wp.created_at ORDER BY wp.created_at DESC
         """, [self.request.user.pk])

我们可能会进一步推进,并考虑 Tom D 的建议方法,即简单地将其包装在 if...else 块中以允许不同的数据库连接。