2016-10-27 90 views
4

我嘗試使用django_mssql程序包將django項目(Python 3.5.2和Django 1.10.2)插入到SQLServer數據庫,但創建django內部表時失敗。django mssql安裝程序:初始化數據庫時出錯

以下是我把settings.py

DATABASES = { 
    'default': { 
     'NAME': 'my_db', 
     'ENGINE': 'sqlserver_ado', 
     'HOST': 'my_server', 
     'USER': 'my_user', 
     'PASSWORD': 'super_secret_password', 
     'PORT': '',  
     'OPTIONS': { 
       'provider' : 'SQLNCLI11'    
      }, 
    } 
} 

,當我嘗試推出任何遷移(即使沒有任何模型中定義),我得到:

python manage.py migrate 
(lot of logs here....) 
django.db.utils.DatabaseError: (-2147352567, 'Exception occurred.', (0, 'Microso 
ft SQL Server Native Client 11.0', "The object 'UQ__auth_use__F3DBC57228A1A130' 
is dependent on column 'username'.", None, 0, -2147217900), None) 
Command: 
ALTER TABLE [auth_user] ALTER COLUMN [username] nvarchar(150) NOT NULL 
Parameters: 
[] 

事實上,該表存在,用戶名列可以爲空,但我們當然不能改變它,因爲此列上存在唯一約束。

腳本應該放棄約束,改變列,重新創建約束。或者不要在腳本中儘早創建約束。

我在SQLServer 2008和2014上嘗試過,發生同樣的事情。

我嘗試使用提供程序SQLOLEDB和SQLNCLI11,發生同樣的事情。

我搜索了很長時間,但沒有發現有人看到過這個問題。

我有點卡住了...


編輯:一天怪異的解決辦法:在auth模型的改變定義刪除列名的唯一性。

更確切地說:在<path_to_python>\Lib\site-packages\django\contrib\auth\migrations變化:

  • 0001_initial.py
  • 0004_alter_user_username_opts.py
  • 0007_alter_validators_add_error_messages.py

,並刪除相關的用戶模型的用戶名字段所有unique=True條款。

我希望有一個更好的解決這個問題....

回答

-1

我有完全同樣的問題,我嘗試了「每日怪異的解決辦法」,但並沒有區別的。我正在使用django 1.8,使用django-mssql 1.8版。我的數據庫是MS SQL 2012 express。

我也試過使用不同的提供者,但只有SQLOLEDB會連接在我的情況。

我跑到下面的命令,並得到了如下的結果,highlighing文件導致了問題

C:\djangocode\testsite01>python manage.py showmigrations --list 
admin 
[X] 0001_initial 
[X] 0002_logentry_remove_auto_add 
auth 
[X] 0001_initial 
[X] 0002_alter_permission_name_max_length 
[X] 0003_alter_user_email_max_length 
[X] 0004_alter_user_username_opts 
[X] 0005_alter_user_last_login_null 
[X] 0006_require_contenttypes_0002 
[X] 0007_alter_validators_add_error_messages 
[ ] 0008_alter_user_username_max_length 
contenttypes 
[X] 0001_initial 
[X] 0002_remove_content_type_name 
sessions 
[ ] 0001_initial 

我使用的Python 3。4

0

我剛纔使用管理上述信息來解決這個問題,以及我的情況呢

,我改變了文件008_alter_user_username_max_length(在我的Windows版本,它是在「C:\ Python34 \ LIB \定點包\ Django的\的contrib \權威性\遷移」

線23:

unique=True 

我把它改爲:

unique=False 

我重做

python manage.py migrate 

和成功

1

,而不是與其他遷移文件鼓搗,使遷移008成兩個部分的運動,第一次手術只是採取約束關閉,改變長度,然後第二個操作是將唯一約束放回(以便用戶名字段仍然是唯一的)並根據設計調整其他參數。

在嘗試更改長度之前,遷移代碼完全(或巧妙地)執行約束,因此第一次操作成功,儘管創建字段時唯一約束已爲True。如果執行順序改變,那麼我們可能需要3次操作 - 首先取消約束,然後改變長度,第三次將約束放回。

有固定的文件,運行

manage.py再次遷移

我已經嘗試通過再次運行它來完成失敗的遷移,並且還完全刪除數據庫,然後再次創建它爲空並正在運行再次遷移以從頭開始構建。兩者似乎都沒有錯誤地工作,給你留下了預期的約束和其他字段屬性。

要應用此修復程序,只需修改的本地版本中遷移的操作列表:

... LIB \站點包\ Django的\的contrib \權威性\遷移\ 008_alter_user_username_max_length.py

做兩個動作,因此:

operations = [ 
    migrations.AlterField(
     model_name='user', 
     name='username', 
     field=models.CharField(
      max_length=150, 
      unique=False, 
     ), 
    ), 
    migrations.AlterField(
     model_name='user', 
     name='username', 
     field=models.CharField(
      error_messages={'unique': 'A user with that username already exists.'}, 
      help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', 
      max_length=150, 
      unique=True, 
      validators=[validators.UnicodeUsernameValidator() if six.PY3 else validators.ASCIIUsernameValidator()], 
      verbose_name='username', 
     ), 
    ), 
]