首页 > 解决方案 > 无法使用 Django oracle12c 在数据库中创建表

问题描述

我正在做一个大学项目,我应该使用 oracle 数据库作为后端,我选择使用 django 作为编程语言。我已经成功地将 django 与 oracle 12c 连接起来,并且还安装了 cx_Oracle。但是当我尝试运行命令时

py manage.py migrate

出现以下错误。

Windows PowerShell 版权所有 (C) Microsoft Corporation。版权所有。

PS C:\Users\Hp\Desktop\onlinepharma> py manage.py migrate
要执行的操作:应用所有迁移:admin、auth、contenttypes、sessions、testing 正在运行迁移:应用 contenttypes.0001_initial...Traceback(最近一次调用最后):文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\db\backends\utils.py”,第 83 行,_execute return self.cursor.execute( sql) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\oracle\base.py”,第 513 行,执行返回 self.cursor。 execute(query, self._param_generator(params)) cx_Oracle.DatabaseError: ORA-00955: name is already used by an existing object

上述异常是以下异常的直接原因:

回溯(最后一次调用):文件“manage.py”,第 15 行,在 execute_from_command_line(sys.argv) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\ django\core\management__init__.py”,第 381 行,在 execute_from_command_line utility.execute() 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\management__init__. py”,第 375 行,在执行 self.fetch_command(subcommand).run_from_argv(self.argv) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\ management\base.py”,第 316 行,run_from_argv self.execute(*args, **cmd_options) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\核心\管理\base.py”,第 353 行,在执行输出 = self.handle(*args, **options) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\management\base.py” ,第 83 行,在包装的 res = handle_func(*args, **kwargs) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\management\commands\ migrate.py”,第 203 行,在句柄 fake_initial=fake_initial,文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\migrations\executor.py”中,第 117 行,在迁移状态 = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\ django\db\migrations\executor.py”,第 147 行,在 _migrate_all_forwards 状态 = self。apply_migration(状态,迁移,fake=fake,fake_initial=fake_initial)文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\migrations\executor.py”,第 244 行,在 apply_migration state = migration.apply(state, schema_editor) File "C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\migrations\migration.py" ,第 124 行,在应用 operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\migrations \operations\models.py”,第 91 行,在 database_forwards schema_editor.create_model(model) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\ base\schema.py”,第 312 行,在 create_model self.execute(sql, params or None) 文件 "C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\base\schema.py",第 133 行,在执行 cursor.execute(sql, params) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\utils.py”中,行100、在执行中返回 super().execute(sql, params) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\utils.py” ,第 68 行,在执行中返回 self._execute_with_wrappers(sql, params, many=False, executor=self._execute) File "C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\ django\db\backends\utils.py”,第 77 行,在 _execute_with_wrappers 中返回 executor(sql, params, many,上下文)文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\utils.py”,第 85 行,_execute return self.cursor.execute( sql, params) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\utils.py”,第 89 行,在从 exc_value 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\utils.py”中退出 raise dj_exc_value.with_traceback(traceback),第 83 行,在_execute 返回 self.cursor.execute(sql) 文件“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\oracle\base.py”,第 513 行, 在执行 return self.cursor.execute(query, self._param_generator(params)) django.db.utils.DatabaseError: ORA-00955: name is already used by an existing object

这是我的 model.py 文件

from django.db import models

# Create your models here.
class yoman(models.Model):
text=models.CharField(max_length=200)

但是我已经使用 sql 命令行进行了检查,并且不存在这样的数据库表或视图。

ps:makemigrations命令运行正常,migratiosn文件也创建好了。

标签: djangopython-3.xoracledjango-modelsoracle12c

解决方案


如果您编辑以下文件,则可以打印出 sql 查询:“C:\Users\Hp\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\oracle\base.py On第 513 行,在调用执行函数之前添加:

print(f'query')

重新运行迁移,您可以看到运行失败的 sql。删除或重命名数据库中的表/对象。


推荐阅读