2017-02-22 21 views
2

我的組織正在開發基於W as作爲CMS後端的新發布平臺。我們在MS SQL數據庫中擁有豐富的內部專業知識,但對Postgres或MySQL沒有任何幫助,所以更願意使用MS SQL(特別是SQL Azure) - Wagtail的文檔似乎暗示了這一點。疑難解答建議需要W// SQL Azure兼容性

我有一個Wagtail運行的實例,並安裝了聲稱支持SQL Azure的Django後端(https://pypi.python.org/pypi/django-pyodbc-azure)。我已經在settings.py中配置了我的數據庫連接設置。

我可以成功運行遷移並創建超級用戶,因此我相當有信心數據庫連接性良好。

那麼我就可以瀏覽到鶺鴒登錄頁面:http://localhost:8000/admin但後立即與提供給createsuperuser腳本的憑據登錄,我收到以下錯誤:

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

這似乎是鶺鴒本身使用這是MS SQL中不支持的LIMIT關鍵字 - 我的最佳解決方法和嘗試解決此問題的方法是什麼?還是我躲在一無所有?

違規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 
+0

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 )來自wagtail/wagtailadmin/views/home的AS max_rev ON max_rev.max_created_at = wp.created_at ORDER BY wp.created_at DESC'。py – nm76

+0

SQLServer沒有'LIMIT' keyword.use'TOP'而不是 – TheGameiswar

+0

請注意,Wagtail目前尚未正式支持SQL Server。過去,用戶已成功獲得Wagtail與SQL Server一起工作,並提供補丁以提供MS SQL兼容性,但目前還沒有正在進行的QA測試來確保它仍然兼容。不幸的是,它看起來像這個查詢在W 1.7 1.7期間滑入,並且至今沒有報道。 – gasman

回答

0

感謝您的答覆,所有。

我們設法通過黑客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]) 

,我們很可能會進一步進展這一點,並考慮到湯姆·D的建議簡單地包裹這在if ... else塊,允許不同的數據庫連接的方法。

1

在大多數情況下,鶺鴒使用Django的ORM,它支持MS SQL。在某些情況下,我們會陷入「原始」SQL,通常是出於性能原因。在這種情況下,正如您所指出的那樣,原始SQL與MS SQL不兼容。有兩種方法,你可以採取以解決此問題:

  1. 重構代碼使用Django的ORM(檢查任何性能影響)

  2. 爲MS SQL,例如提供特殊的情況下,

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