Django单元测试-无法创建django_migrations表
Django单元测试-无法创建django_migrations表
我正在尝试编写一些单元测试并使用manage.py test
运行它们,但是由于某些原因,脚本无法创建django_migrations
表。
以下是完整的错误信息:
Creating test database for alias 'default'... Traceback (most recent call last): File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\backends\utils.py", line 83, in _execute return self.cursor.execute(sql) psycopg2.ProgrammingError: no schema has been selected to create in LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA... ^ The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\migrations\recorder.py", line 55, in ensure_schema editor.create_model(self.Migration) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\backends\base\schema.py", line 298, in create_model self.execute(sql, params or None) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\backends\base\schema.py", line 117, in execute cursor.execute(sql, params) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\backends\utils.py", line 68, in execute return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers return executor(sql, params, many, context) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\backends\utils.py", line 85, in _execute return self.cursor.execute(sql, params) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\utils.py", line 89, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\backends\utils.py", line 83, in _execute return self.cursor.execute(sql) django.db.utils.ProgrammingError: no schema has been selected to create in LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA... ^ During handling of the above exception, another exception occurred: Traceback (most recent call last): File "manage.py", line 15, in execute_from_command_line(sys.argv) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\core\management\__init__.py", line 371, in execute_from_command_line utility.execute() File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\core\management\__init__.py", line 365, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\core\management\commands\test.py", line 26, in run_from_argv super().run_from_argv(argv) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\core\management\base.py", line 288, in run_from_argv self.execute(*args, **cmd_options) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\core\management\base.py", line 335, in execute output = self.handle(*args, **options) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\core\management\commands\test.py", line 59, in handle failures = test_runner.run_tests(test_labels) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\test\runner.py", line 601, in run_tests old_config = self.setup_databases() File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\test\runner.py", line 548, in setup_databases self.parallel, **kwargs File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\test\utils.py", line 176, in setup_databases serialize=connection.settings_dict.get('TEST', {}).get('SERIALIZE', True), File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\backends\base\creation.py", line 68, in create_test_db run_syncdb=True, File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\core\management\__init__.py", line 141, in call_command return command.execute(*args, **defaults) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\core\management\base.py", line 335, in execute output = self.handle(*args, **options) File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\core\management\commands\migrate.py", line 200, in handle fake_initial=fake_initial, File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\migrations\executor.py", line 91, in migrate self.recorder.ensure_schema() File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\migrations\recorder.py", line 57, in ensure_schema raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc) django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table (no schema has been selected to create in LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA... ^ )
我尝试运行这些GRANT
语句,这里有一个建议:
grant usage on schema public to ; grant create on schema public to ;
但我仍然收到同样的消息。有什么想法如何解决这个问题?也许这是一个搜索路径问题?
更新
~ python manage.py makemigrations users Migrations for 'users': users\migrations\0001_initial.py - Create model MyUser ~ python manage.py migrate Operations to perform: Apply all migrations: auth, contenttypes, sessions, users Running migrations: No migrations to apply.
在执行migrate
之前,我尝试了makemigrations
(傻瓜!),但我仍然收到之前的相同错误。迁移是否已应用?我还应该提到,我的models.py只有一个模型/表,它不由Django“管理”。
Bueller...Bueller...Beuller...有人吗?
我也遇到了同样的错误,但已经解决了。在我的情况下,我相信问题出在我将Django默认模式设置为django时,在运行$ python manage.py test时,测试函数试图将一些表迁移到数据库test模式django,但是模式django尚未被创建。所以解决方法要么是(1)允许Django测试函数在模式public中搜索,要么是(2)在没有测试数据库的情况下运行单元测试。
从这个问题的被接受的答案来看,我想我的情况与问题是不同的。但我认为两者都是由于Django无法在搜索路径中找到模式而导致的。因此我在这里发布了我的解决方案。希望它能帮助类似的情况。
(django-tally-QTYVOJb0) (python3.6) D:\github\django-tally>python manage.py test Creating test database for alias 'default'... Got an error creating the test database: database "test" already exists Type 'yes' if you would like to try deleting the test database 'test', or 'no' to cancel: yes Destroying old test database for alias 'default'... Traceback (most recent call last): File "C:\Users\guido\.virtualenvs\django-tally-QTYVOJb0\lib\site-packages\django\db\backends\utils.py", line 84, in _execute return self.cursor.execute(sql) psycopg2.errors.InvalidSchemaName: no schema has been selected to create in LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA...
对于解决方案(1):
settings.py中的数据库设置在此之前是这样的。
if 'RDS_HOSTNAME' in os.environ: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ['RDS_DB_NAME'], 'USER': os.environ['RDS_USERNAME'], 'PASSWORD': os.environ['RDS_PASSWORD'], 'HOST': os.environ['RDS_HOSTNAME'], 'PORT': os.environ['RDS_PORT'], 'OPTIONS': { 'options': '-c search_path=django' }, 'TEST': { 'NAME': 'test', # test database name }, }, }
现在它看起来像这样。我将public添加到了搜索路径中。
if 'RDS_HOSTNAME' in os.environ: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ['RDS_DB_NAME'], 'USER': os.environ['RDS_USERNAME'], 'PASSWORD': os.environ['RDS_PASSWORD'], 'HOST': os.environ['RDS_HOSTNAME'], 'PORT': os.environ['RDS_PORT'], 'OPTIONS': { 'options': '-c search_path=django,public' }, 'TEST': { 'NAME': 'test', # test database name }, }, }
对于同样的错误,我做了不同的事情,虽然不是完全不同,但我直接去了psql服务器(在我的情况下)。这发生在开发过程中。因此,我没有意识到可能会有数据损失。
选择你的数据库。然后创建模式。
CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO public;
我从https://stackoverflow.com/a/13823560/10860596获得了答案。因为我删除了所有表格,所以我遇到了问题。