获取 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 时的版本的主要内容,如果未能解决你的问题,请参考以下文章
django:sqlite3.OperationalError:没有这样的表
Django / sqlite3“OperationalError:没有这样的表”关于线程操作
OperationalError:没有这样的表:django_content_type 和 django_session