2017-04-05 138 views
3

沒有顯示我已經使用後makemigrations這個錯誤命令 我曾嘗試爲它註釋不同列,但它不會工作django.db.utils.OperationalError:近「[]」:語法錯誤

C:\Users\Rushabh\Desktop\project\MyPrj>python manage.py migrate 
Operations to perform: 
    Apply all migrations: admin, auth, contenttypes, paper, sessions 
Running migrations: 
    Applying paper.0014_auto_20170405_1549...Traceback (most recent call last): 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\backends\utils.py", line 62, in execute 
    return self.cursor.execute(sql) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\backends\sqlite3\base.py", line 335, in execute 
    return Database.Cursor.execute(self, query) 
sqlite3.OperationalError: near "[]": syntax error 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "manage.py", line 22, in <module> 
    execute_from_command_line(sys.argv) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\core\management\__init__.py", line 367, in execute_from_command_line 
    utility.execute() 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\core\management\__init__.py", line 359, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\core\management\base.py", line 294, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\core\management\base.py", line 345, in execute 
    output = self.handle(*args, **options) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\core\management\commands\migrate.py", line 204, in handle 
    fake_initial=fake_initial, 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\migrations\executor.py", line 115, in migrate 
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\migrations\executor.py", line 145, in _migrate_all_forwards 
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\migrations\executor.py", line 244, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\migrations\migration.py", line 129, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\migrations\operations\fields.py", line 84, in database_forwards 
    field, 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\backends\sqlite3\schema.py", line 231, in add_field 
    self._remake_table(model, create_fields=[field]) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\backends\sqlite3\schema.py", line 191, in _remake_table 
    self.create_model(temp_model) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\backends\base\schema.py", line 295, in create_model 
    self.execute(sql, params or None) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\backends\base\schema.py", line 112, in execute 
    cursor.execute(sql, params) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\backends\utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\backends\utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\utils\six.py", line 685, in reraise 
    raise value.with_traceback(tb) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\backends\utils.py", line 62, in execute 
    return self.cursor.execute(sql) 
    File "C:\Users\Rushabh\Anaconda3\lib\site-packages\django\db\backends\sqlite3\base.py", line 335, in execute 
    return Database.Cursor.execute(self, query) 
django.db.utils.OperationalError: near "[]": syntax error 

遷移文件

from __future__ import unicode_literals 

import django.contrib.postgres.fields 
from django.db import migrations, models 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('paper', '0019_auto_20170405_1659'), 
    ] 

    operations = [ 
     migrations.AddField(
      model_name='test', 
      name='checked', 
      field=models.BooleanField(default=False), 
     ), 
     migrations.AddField(
      model_name='test', 
      name='mark3', 
      field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=5), default=[], size=None), 
     ), 
     migrations.AddField(
      model_name='test', 
      name='mark4', 
      field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=5), default=[], size=None), 
     ), 
     migrations.AddField(
      model_name='test', 
      name='mark7', 
      field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=5), default=[], size=None), 
     ), 
     migrations.AddField(
      model_name='test', 
      name='request', 
      field=models.BooleanField(default=False), 
     ), 
    ] 

的問題出現後,我添加了以下字段添加到我的模型

mark3=ArrayField(models.CharField(max_length=5),default=[]) 

models.py文件是

from django.db import models 
from django.contrib.postgres.fields import ArrayField 

class User(models.Model): 
    user_id=models.CharField(unique=True,max_length=50) 
    password=models.CharField(max_length=50) 
    role=models.IntegerField(blank=False) 
    def __str__(self): 
     return self.user_id 


class Qbank(models.Model): 
    user=models.ForeignKey(User,on_delete=models.CASCADE) 
    qbank_id=models.CharField(unique=True,max_length=50,blank=False) 
    # subject_id=models.CharField(max_length=50) 
    qbank_file=models.FileField(upload_to= 'qbs/',blank=False) 
    ans_file=models.FileField(upload_to= 'ans/',blank=False) 
    uploaded_at = models.DateTimeField(auto_now_add=True) 
    def __str__(self): 
     return self.qbank_id 


class Test(models.Model): 
    qbank=models.ForeignKey(Qbank,on_delete=models.CASCADE) 
    test_id=models.CharField(unique=True,max_length=50) 
    request=models.BooleanField(default=False) 
    checked=models.BooleanField(default=False) 
    mark3=ArrayField(models.CharField(max_length=5),default=[]) 
    mark4=ArrayField(models.CharField(max_length=5),default=[]) 
    mark7=ArrayField(models.CharField(max_length=5),default=[]) 
    # true if send and checked respt 
    def __str__(self): 
     return self.test_id 

回答

0

ArrayField文檔警告說,你不應該使用一個可變值就像[]。您可以使用可調用list作爲默認值。

class Test(models.Model): 
    ... 
    mark3=ArrayField(models.CharField(max_length=5), default=list) 
    mark4=ArrayField(models.CharField(max_length=5), default=list) 
    mark7=ArrayField(models.CharField(max_length=5), default=list) 

進行此更改後,請刪除舊遷移文件並再次運行makemigrations

+0

現在的錯誤是沒有這樣的列:paper_test.mark3 –

+0

對不起,這聽起來像是一個單獨的問題,我不能告訴你所提供的信息的問題。如果這是一個使用新模型的測試項目,最簡單的修復方法可能是刪除數據庫,刪除遷移文件,創建新的遷移並遷移。 – Alasdair

3

我也對這個問題感到困惑。該ArrayField是特定於Postgres的,並從一個Postgres庫中導入:

import django.contrib.postgres.fields 

它看起來像你想提交你遷移到SQLite的。你應該建立一個本地Postgres數據庫,並從更新settings.py文件:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 

要:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql', 
     'NAME': 'DATABASE NAME', 
     'USER': 'USER NAME', 
     'PASSWORD': 'USER PASSWORD', 
     'HOST': 'localhost', 
     'PORT': '5432', 
    } 
} 

而且,你是不正確設置你的ArrayField的默認值。每Django ArrayField documentation,你不應該使用[]作爲默認值。這不會導致這個問題,但它可能會創造一些其他的!您應該使用default=list代替default=[],這將創造ArrayField的所有實例之間共享一個可變默認:

相反的:

mark7=ArrayField(models.CharField(max_length=5),default=[]) 

嘗試:

mark7=ArrayField(models.CharField(max_length=5),default=list)