我尝试使用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
更改:
并删除与用户模型的用户名字段相关的所有unique=True
子句。
我希望有一个更好的解决方案来解决这个问题....
答案 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