models.py
class Stop(models.Model): idn = models.PositiveIntegerField(primary_key=True,unique=True) label = models.CharField(null=False,blank=False,max_length=512) coor_x = models.FloatField() coor_y = models.FloatField() buses = models.ManyToManyField(Bus) latest_query_datetime = models.DateTimeField(default=datetime(2000,1,0)) latest_query_data = JSONField(default={}) class Meta: ordering = ["label"] def __str__(self): return self.label
当我跑:
python3 manage.py makemigrations && python3 manage.py migrate
它引发了一个ProgrammingError,说jsonb数据类型不存在:
Migrations for 'rest': 0007_auto_20160612_1301.py: - Alter field latest_query_data on stop Operations to perform: Apply all migrations: contenttypes,rest,auth,sessions,admin Running migrations: Rendering model states... DONE Applying rest.0005_auto_20160612_1237...Traceback (most recent call last): File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/db/backends/utils.py",line 64,in execute return self.cursor.execute(sql,params) psycopg2.ProgrammingError: type "jsonb" does not exist LINE 1: ... TABLE "rest_stop" ADD COLUMN "latest_query_data" jsonb DEFA... ^ The above exception was the direct cause of the following exception: Traceback (most recent call last): File "manage.py",line 10,in <module> execute_from_command_line(sys.argv) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/core/management/__init__.py",line 353,in execute_from_command_line utility.execute() File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/core/management/__init__.py",line 345,in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/core/management/base.py",line 348,in run_from_argv self.execute(*args,**cmd_options) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/core/management/base.py",line 399,in execute output = self.handle(*args,**options) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/core/management/commands/migrate.py",line 200,in handle executor.migrate(targets,plan,fake=fake,fake_initial=fake_initial) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/db/migrations/executor.py",line 92,in migrate self._migrate_all_forwards(plan,full_plan,line 121,in _migrate_all_forwards state = self.apply_migration(state,migration,line 198,in apply_migration state = migration.apply(state,schema_editor) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/db/migrations/migration.py",line 123,in apply operation.database_forwards(self.app_label,schema_editor,old_state,project_state) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/db/migrations/operations/fields.py",line 62,in database_forwards field,File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/db/backends/base/schema.py",line 396,in add_field self.execute(sql,params) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/db/backends/base/schema.py",line 110,in execute cursor.execute(sql,params) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/db/backends/utils.py",line 79,in execute return super(CursorDebugWrapper,self).execute(sql,params) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/db/utils.py",line 95,in __exit__ six.reraise(dj_exc_type,dj_exc_value,traceback) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/utils/six.py",line 685,in reraise raise value.with_traceback(tb) File "/home/erayerdin/.venv/eshot-api/lib/python3.5/site-packages/django/db/backends/utils.py",params) django.db.utils.ProgrammingError: type "jsonb" does not exist LINE 1: ... TABLE "rest_stop" ADD COLUMN "latest_query_data" jsonb DEFA...
我使用Postgresql来使用JSONField并在用户请求视图时更新它.如果我不使用default = {},它会告诉我创建一个.
更深入的分析
我将latest_query_data字段更改为TextField,以便我可以存储为字符串并在需要时转换为dict.但是,这也引起了同样的错误.
环境
> django 1.9.6
> psycopg 2.6.1