使用Django进行Oracle数据库配置以及迁移面临错误的应用程序
django.db.migrations.exceptions.MigrationSchemaMissing:无法 创建dja ngo_migrations表(ORA-02000:总是丢失 关键字)
application environment
1.windows10
2.Python 3.6.x
3.Django 2.0.2
4.oracle 11g XE
in settins.py file
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'xe',
'USER': 'abc',
'PASSWORD':'xxxx',
'HOST':'localhost',
'PORT':"1521",
}
答案 0 :(得分:3)
在上面提到的代码中删除self.cursor.numbersAsStrings = True
答案 1 :(得分:2)
问题是Django 2.0.2仅支持oracle 12g。检查一下:
How to make Django 2.0 to use Oracle 11g syntax instead of 12c?
此外,您可以检查sql失败,如下面的问题所示(添加到manage.py打印(查询)行)
Unable to create the django_migrations table (ORA-02000: missing ALWAYS keyword)
我按照第一个问题的建议降级到Django 1.11,但这导致我错误“AttributeError:'cx_Oracle.Cursor'对象没有属性'numbersAsStrings'”因为我有安装了最后一个cx_Oracle版本。 (更多信息请访问:https://code.djangoproject.com/ticket/28138)
要解决此问题,我将文件 C:\ Program Files \ Python37 \ lib \ site-packages \ django \ db \ backends \ oracle \ base.py 修改为:
def __init__(self, connection):
self.cursor = connection.cursor()
# Necessary to retrieve decimal values without rounding error.
self.cursor.numbersAsStrings = True
self.cursor.outputtypehandler = self._output_type_handler
# Default arraysize of 1 is highly sub-optimal.
self.cursor.arraysize = 100
# https://github.com/django/django/commit/d52577b62b3138674807ac74251fab7faed48331
@staticmethod
def _output_type_handler(cursor, name, defaultType, length, precision, scale):
"""
Called for each db column fetched from cursors. Return numbers as
strings so that decimal values don't have rounding error.
"""
if defaultType == Database.NUMBER:
return cursor.var(
Database.STRING,
size=255,
arraysize=cursor.arraysize,
outconverter=str,
)
我从这里开始使用此代码块:
有了这个,我至少能够迁移项目。我不知道在走得更远时是否会失败。
希望这有帮助!
PD:我认为您的DATABASES设置应该与http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/oow10/python_django/python_django.htm
中一样DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'localhost/orcl',
'USER': 'pythonhol',
'PASSWORD': 'welcome',
}}