django mssql setup:初始化DB时出错

时间:2016-10-27 15:01:50

标签: python sql-server django

我尝试使用django_mssql包将django项目(Python 3.5.2和Django 1.10.2)插入SQLServer数据库,但在创建django内部表时失败。

以下是我在 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子句。

我希望有一个更好的解决方案来解决这个问题....

3 个答案:

答案 0 :(得分:1)

不要修改其他迁移文件,而是将迁移008转换为两部分练习,第一个操作只是关闭约束并更改长度,然后再执行第二个操作以放回唯一约束(以便用户名字段仍然是如预期的那样独特)并按设计调整其他参数。

幸运地(或巧妙地)迁移代码在尝试更改长度之前执行约束操作,因此尽管唯一约束已经从字段创建为True,但第一个操作成功。如果执行顺序改变,那么我们可能需要3个操作 - 首先关闭约束,第二个改变长度,第三个将约束放回。

修复文件后,运行

  

manage.py migrate

试。

我尝试通过再次运行来完成失败的迁移,并完全删除数据库然后再次创建它并再次运行迁移以从头开始构建。两者似乎都没有错误地工作,并且保留了预期的约束和其他字段属性。

要应用此修复程序,只需在本地版本的

中修改Migration中的操作列表即可

... Lib \ site-packages \ django \ contrib \ auth \ migrations \ 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',
        ),
    ),
]

答案 1 :(得分:0)

我刚刚设法解决了这个问题,反正我的情况

使用上述信息,我更改了文件008_alter_user_username_max_length(在我的Windows版本中,它位于&#34; C:\ Python34 \ Lib \ site-packages \ django \ contrib \ auth \ migrations&#34;

第23行是:

unique=True

我将其更改为:

unique=False

我重做

python manage.py migrate

成功

答案 2 :(得分:-1)

我有完全相同的问题,我尝试了“当天奇怪的解决方法”,但没有任何区别。我正在使用django 1.8,与django-mssql版本1.8。我的数据库是MS SQL 2012 express。

我也尝试过使用不同的提供程序,但在我的情况下只会连接SQLOLEDB。

我运行了以下命令,得到了以下结果,高亮显示导致问题的文件

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