为什么 django 试图创建迁移 table 而我的目的只是读取现有的 oracle 数据库

Why django trying to create migration table when my purpose is just to read existing oracle database

我的目的是连接到 oracle 数据库和 运行 查询以便在网页上填充这些结果。但是当我尝试 运行 python manage.py 迁移时,我遇到了以下错误。即使我使用选项 --fake-initial 或 --fake 同样的错误。我不想创建任何 table。我刚刚更改了 settings.py 文件以连接到 oracle 数据库而不是 sqlite。

    Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Traceback (most recent call last):
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\backends\utils.py", line 83, in _execute
    return self.cursor.execute(sql)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\backends\oracle\base.py", line 506, in execute
    return self.cursor.execute(query, self._param_generator(params))
cx_Oracle.DatabaseError: ORA-01031: insufficient privileges

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\migrations\recorder.py", line 55, in ensure_schema
    editor.create_model(self.Migration)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\backends\base\schema.py", line 312, in create_model
    self.execute(sql, params or None)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\backends\base\schema.py", line 133, in execute
    cursor.execute(sql, params)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\backends\utils.py", line 100, in execute
    return super().execute(sql, params)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\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:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\backends\utils.py", line 83, in _execute
    return self.cursor.execute(sql)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\backends\oracle\base.py", line 506, in execute
    return self.cursor.execute(query, self._param_generator(params))
django.db.utils.DatabaseError: ORA-01031: insufficient privileges

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\core\management\base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\core\management\base.py", line 353, in execute
    output = self.handle(*args, **options)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\core\management\base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\core\management\commands\migrate.py", line 203, in handle
    fake_initial=fake_initial,
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\lib\site-packages\django\db\migrations\executor.py", line 91, in migrate
    self.recorder.ensure_schema()
  File "C:\Users\rishbans\Anaconda3\envs\DjangoProject\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 (ORA-01031: insufficient privileges)

app/models.py

from django.db import connection

# Create your models here.

def my_custom_sql(self):
    with connection.cursor() as cursor:
        cursor.execute("SELECT * FROM MY_TABLE")
        row = cursor.fetchone()

    return row

Django 需要一个 read/write 数据库作为其 default 数据库来跟踪名为 django_migrations 的 table 中的迁移。更改您的设置以将 SQLite(或其他)数据库设置为您的 default 数据库,然后为您的只读 Oracle 数据库创建一个名为 my_oracle 的第二个条目:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'mydatabase',
    },
    'my_oracle': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': '',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    },
}

那么您可以:

from django.db import connections

def my_custom_sql(self):
    with connections["my_oracle"].cursor() as cursor:
        cursor.execute("SELECT * FROM MY_TABLE")
        row = cursor.fetchone()

        return row

祝你好运!