获取 OperationalError:没有这样的功能:第一次运行 syncdb 时的版本

Posted

技术标签:

【中文标题】获取 OperationalError:没有这样的功能:第一次运行 syncdb 时的版本【英文标题】:Getting OperationalError: no such function: version when running syncdb for the first time 【发布时间】:2016-05-28 17:52:45 【问题描述】:

我正在为现有的 Django 代码库设置一个新环境。但是,很遗憾我无法成功完成./manage.py syncdb./managage.py migrate。这是我的错误输出,包括完整的回溯:

./manage.py syncdb
Operations to perform:
  Synchronize unmigrated apps: djcelery, rest_framework_swagger, django_extensions, taggit_serializer, djrill, rest_framework, staticfiles, django_jinja, _humanize, messages, flat, corsheaders
  Apply all migrations: contenttypes, taggit, push, auth, admin, djmail, plug, site, sessions, kombu_transport_django, user, core, grid
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying user.0001_initial...Traceback (most recent call last):
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 316, in execute
    return Database.Cursor.execute(self, query)
sqlite3.OperationalError: no such function: version

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 "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/core/management/base.py", line 393, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/core/management/base.py", line 444, in execute
    output = self.handle(*args, **options)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/core/management/commands/syncdb.py", line 25, in handle
    call_command("migrate", **options)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/core/management/__init__.py", line 120, in call_command
    return command.execute(*args, **defaults)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/core/management/base.py", line 444, in execute
    output = self.handle(*args, **options)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 222, in handle
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/migrations/executor.py", line 110, in migrate
    self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/migrations/executor.py", line 148, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/migrations/migration.py", line 115, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/migrations/operations/models.py", line 59, in database_forwards
    schema_editor.create_model(model)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 236, in create_model
    definition, extra_params = self.column_sql(model, field)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 135, in column_sql
    db_params = field.db_parameters(connection=self.connection)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 625, in db_parameters
    type_string = self.db_type(connection)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django_pgjson/fields.py", line 51, in db_type
    if get_version(connection) < 90200:
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/backends/postgresql_psycopg2/version.py", line 43, in get_version
    cursor.execute("SELECT version()")
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/utils/six.py", line 658, in reraise
    raise value.with_traceback(tb)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
  File "/Users/jamesrasmussen/.virtualenvs/honey-api/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 316, in execute
    return Database.Cursor.execute(self, query)
django.db.utils.OperationalError: no such function: version

其他信息: Django 版本:1.8.4 Python版本:3.5.1

我的数据库设置:

# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    

我试图在 Django 中找到调用任何 version() 函数的位置,但没有成功。我也曾尝试在 OSX 上调整我的 SQLite3 版本,但对更改默认系统版本持谨慎态度。提前感谢您的帮助。

【问题讨论】:

你能写下你的settings.py文件吗? @VíctorM 更新了问题以包含我的数据库设置。如果您需要我的整个设置文件,它的净化版本在这里:dpaste.de/bmdE 现有代码库使用的是什么版本的 django? 在我的requirements.txt 文件中:Django==1.8.4。所有版本使用1.8.4 @VíctorM 我刚刚回答了我的问题。我相信我想通了。我的猜想是当 Django 运行我的迁移文件时,Postgres 的get_version() 有一些要求,尽管我不知道在哪里,也没有足够地查看 Django 的迁移源来知道是否是这种情况。无论如何,感谢您帮助我意识到该堆栈跟踪中有一个 Postgres 调用,因为我永远不会在我的代码库中搜索 postgres 并找到 local.example.py 文件。 【参考方案1】:

在过去的一个项目中,我看到执行手工 SQL 的 django(南)迁移 - 当这些迁移包含数据库供应商特定代码时,它们不能针对另一个数据库后端运行。所以首先我会检查失败的迁移文件的内容,以确认或排除这种可能性。

【讨论】:

【参考方案2】:

好的,我觉得自己很愚蠢,因为我不完全了解正在发生的事情,而且这个答案对我的环境非常具体,对其他人来说毫无用处,但我确实让它起作用了执行以下操作:

我意识到我的.gitignore 文件有一个settings/local.py 条目。我查了一下,没有local.py 文件,但我有local.example.py 文件。因此,我将该文件复制到 local.py 示例中,并看到它确实使用 django.db.backends.postgresql_psycopg2 作为其数据库后端。我认为在项目的迁移文件的某个地方,发生了对 Postgres 的 get_version() 函数的特定调用。现在我已经安装了 Postgres 并为这个项目创建了一个数据库,syncdb 命令可以完美运行。

我现在的数据库设置:

DATABASES = 
    "default": 
        "ENGINE": "django.db.backends.postgresql_psycopg2",
        "NAME": "honey-api",
    

很抱歉把所有帮助我的东西都送了出去。感谢您的帮助。

【讨论】:

以上是关于获取 OperationalError:没有这样的功能:第一次运行 syncdb 时的版本的主要内容,如果未能解决你的问题,请参考以下文章

OperationalError:没有这样的表

OperationalError,没有这样的列。姜戈

django:sqlite3.OperationalError:没有这样的表

Django / sqlite3“OperationalError:没有这样的表”关于线程操作

OperationalError:没有这样的表:django_content_type 和 django_session

django.db.utils.OperationalError:无法连接到服务器:没有这样的文件或目录